在运行C++应用程序时,我遇到了一个非常恼人的问题。我在Windows Xp的Interix子系统上使用pgcpp编译器。我的问题主要描述在这里:
我在一个头文件中有一个类定义。这个头文件包含在一个源文件中。这个类有两个构造函数,基本上用来实现一个记录器。第一个构造函数接受ostream *作为参数,而第二个重载构造函数接受文件名和默认布尔值false。第二个构造器的目标是获取我们传递的文件名的流,并开始记录消息。构造函数中的代码如下:
MessageLogger::MessageLogger(std::ostream *out): p_out (out), p_ofstream (0)
{
if (p_out)
{
(*p_out) << "Started logging messages" << endl;
}
}
MessageLogger::MessageLogger (char const *filename, bool append_to_file) : p_out (0), p_ofstream (0)
{
if (append_to_file)
{
p_ofstream = new std::ofstream (filename, ios::app);
}
else
{
p_ofstream = new std::ofstream (filename);
}
p_out = p_ofstream;
if (p_out)
{
(*p_out) << "Started logging messages" << endl;
}
} 其中,p_out和p_ofstream的声明如下:
std::ostream *p_out;
std::ofstream *p_ofstream;
unsigned int p_indent_level;上面提到的三个都是私人成员。MessageLogger类的实例化如下所示:
MessageLogger logger ("filename");请注意,append_to_file的默认值为false。PGDBG也行为不端。令人费解的是,当控件位于p_ofstream = new std::ofstream (filename);时,它会进入一个随机位置,然后应用程序崩溃。
此外,当我尝试查看PGDBG中的混合代码或反汇编代码时,调试器崩溃并显示以下消息:
jpgdbg parse: Newline must follow cmd in 'eleq "0" struct MessageLogger *Mes
sageLogger::MessageLogger(struct basic_ostream *out); (TranslatorGeneric.cpp
)
'
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5
jpgdbg parse: Newline must follow cmd in 'eleq "1" struct MessageLogger *Mes
sageLogger::MessageLogger(char *filename, unsigned char append_to_file); (Tr
anslatorGeneric.cpp)
'
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5我无法在示例程序中重现这一点,在示例程序中我做了与上面完全相同的事情,但一切工作正常。有人能解释一下发生了什么吗?有没有解决的办法?
谢谢,阿迪亚。
发布于 2010-11-18 20:57:29
为什么要使用动态分配的ofstream实例?你为什么不这样做呢?
class Logger
{
public:
Logger(ostream& str) : _str(str.rdbuf()) // use the buffer from the stream
{
_str << "writing to passed in buffer" << endl;
}
Logger(const char* fname, bool append = false) : _str(cout.rdbuf())
{
_file.open(fname, (append)? ios::out|ios::app : ios::out);
if (_file.is_open())
_str.rdbuf(&_file); // redirects to file, else remains on cout
_str << "expected to be logging to: " << fname << endl;
}
// use as needed
private:
filebuf _file;
ostream _str;
};这样,即使你的文件失败了,你仍然有日志输出到cout…
回到你的问题,HW_NEW是做什么的?用你提供的基本信息很难说清楚...
https://stackoverflow.com/questions/4214594
复制相似问题