我有以下代码
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 # %d\n");
logfile << errFormat % __FILE__ % (int)(__LINE__-3) << endl;
}
char* fmtMessage;
va_start(arg, fmt);
vsprintf(fmtMessage, fmt, arg);
va_end(arg);
try
{
cout << "write to logfile\t" << 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方法调用发表评论,那么我会得到最后的“退出”行,但函数永远不会返回。
这是在main的第一行上调用的第一行函数调用的,所以我很确定在这一点上我不能过于认真地搞砸任何东西。 我确实通过valgrind运行它,但没有发现任何东西。
并非所有cout调用都只是调试而不是程序本身的一部分。
答案 0 :(得分:0)
发现问题。
char* fmtMessage;
这是一个未初始化的字符串缓冲区。用以下代替:
char fmtMessage[1024];
解决了这个问题。
如果我想让它再次动态,我可以假设我需要malloc一些内存来分配原始指针定义,还是有更好的方法?