以下最少的代码示例在正常终止(按回车键)时运行良好:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class SingletonLogClass
{
private:
SingletonLogClass() {}
public:
~SingletonLogClass()
{
LogMessage("~SingletonLogClass()");
}
static SingletonLogClass& getInstance(void)
{
static SingletonLogClass inst;
return inst;
}
void LogMessage(string msg)
{
//printf("%s\n", msg.c_str());
cout << msg << endl;
}
};
int main(int argc, char* argv[])
{
SingletonLogClass::getInstance().LogMessage("This is a message");
getchar();
return 0;
}
当我通过关闭控制台窗口来终止程序时,它取决于 LogMessage
函数的实现。如果它是使用 printf
实现的,一切都很好。但是当它使用 cout
实现时,我遇到了访问冲突。
谁能解释一下?
当程序通过关闭控制台窗口终止时究竟发生了什么?
为什么它适用于 printf
但不适用于 cout
?
我正在使用 VC++ 2010。
最佳答案
cout
是一个全局对象。您的单例实例(在 getInstance
静态成员函数中定义为静态)也是一个全局对象。
在 C++ 中,您无法控制构造顺序,也无法控制全局对象的销毁。因此,有可能 cout
对象在 SingletonLogClass
之前被破坏。当你的 SingletonLogClass
的析构函数记录一些东西时,它不能再使用 cout
(而 printf
没问题)。
当程序正常终止(按回车)并因此退出 main
函数时,与当程序通过关闭 shell 突然终止时的行为差异来自全局变量的销毁顺序. 您无法控制全局对象的销毁顺序。
关于c++ - 异常程序终止时的访问冲突 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6304357/