Ofstream关闭崩溃程序



我有以下代码

void _log_message(const char* fmt, ...) 
{
va_list arg;
ofstream logfile;
    cout << "Open Log File" << endl;
    logfile.open(LOG_FILE, ios::out | ios::app);
    if(!logfile.is_open()) return;
    time_t t = time(NULL);
    struct tm *tmptr = gmtime(&t);
    char tmStr[70];
    if (tmptr == NULL || strftime(tmStr, sizeof tmStr, "%Y-%m-%d %H:%M:%S", tmptr) == 0)
    {
        boost::format errFormat("gmtime() failed in file %s at line # %dn");
        logfile << errFormat % __FILE__ % (int)(__LINE__-3) << endl;
    }
    char* fmtMessage;
    va_start(arg, fmt);
    vsprintf(fmtMessage, fmt, arg);
    va_end(arg);
    try
    {
        cout << "write to logfilet" << tmStr << "t" << fmtMessage << endl;
        logfile << tmStr << "t" << fmtMessage << endl;     
        cout << "close logfile" << endl;
        logfile.close();
        cout << "close done" << endl;
    }
    catch(exception e)
    {
        cout << "Exception: " << e.what() << endl;
    }
    cout << "exit" << endl;
}

它运行良好,直到输出到日志文件。然后就停止了。没有我能发现的错误,也没有被捕获的异常。

Open Log File
write to logfile        2014-07-30 16:12:34     Starting...

我检查了ps,进程是死的,不是挂起的。

如果我从行尾删除endl,那么它可以工作,但随后它在close方法调用中再次遇到同样的问题:

Open Log File
write to logfile        2014-07-30 16:15:53     Starting...
close logfile

如果我在close方法调用上注释,那么我得到最后的"exit"行,但函数永远不会返回。

这是在main的第一行调用的函数的第一行调用的,所以我很确定到那时我不会把任何事情搞得太严重。我确实在valgrind上运行了,但是没有找到任何结果。

并不是说所有的cout调用都只是调试而不是程序本身的一部分。

找到问题。

char* fmtMessage;

这是一个未初始化的字符串缓冲区。替换为:

char fmtMessage[1024];

解决了问题。

如果我想让它再次动态,我可以假设我需要malloc一些内存分配给原始指针定义,或者有一个更好的方法?

相关内容

  • 没有找到相关文章

最新更新