gpt4 book ai didi

c++ - 异常程序终止时的访问冲突 (C++)

转载 作者:太空狗 更新时间:2023-10-29 20:30:39 26 4
gpt4 key购买 nike

以下最少的代码示例在正常终止(按回车键)时运行良好:

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com