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

标签 c++ access-violation

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

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

相关文章:

c++ - 访问冲突写入位置错误

c++ - 从 txt 文件读取时,我的程序不会移动到下一行

c++ - 如何调查启动应用程序时发生的访问冲突的来源?

c++ - 为什么 istreambuf_iterator 提前工作

C++ 等于运算符

c++ - pdb 文件,检查磁盘空间不足、路径无效或权限不足

c++ - 为什么在锁定 weak_ptr 时会出现访问冲突?

c++ - 将 int 128 除法 boost 为 float

带条件的 C++ 模板非类型参数

c# - UWP 访问冲突异常