【发布时间】:2010-11-18 12:12:09
【问题描述】:
我在运行 C++ 应用程序时遇到了一个非常烦人的问题。我在 Windows Xp 的 Interix 子系统上使用 pgcpp 编译器。我的问题基本上在这里描述:
我在头文件中有一个类定义。该头文件包含在一个源文件中。这个类有两个构造函数,主要用于实现一个记录器。第一个构造函数接受 ostream *out 作为参数,而第二个重载构造函数接受文件名和默认布尔值 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
我无法在示例程序中重现这一点,我做了与上面完全相同的事情,但一切正常。有人可以解释发生了什么,如果有解决办法?
谢谢, 阿迪亚。
【问题讨论】:
-
在您的代码中,
append_to_file没有默认值。 -
您的问题是关于应用程序还是调试器?在这两种情况下:你到底在问什么?
-
问题是关于失败的应用程序。调试器只是我认为应该分享的一个附加问题。 append_to_file 设置为 false。很抱歉我没有显示完整的代码。
-
如果这有帮助:我莫名其妙地能够进入 p_ofstream = new std::ofstream (filename); 行我的调试器将我带到某个随机的地方(一直是同一个地方),然后再进入另一个地方。这似乎非常奇怪。编译完成后目标文件是否有可能以某种方式损坏?