编程语言
首页 > 编程语言> > 异常程序终止时的访问冲突(C)

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

作者:互联网

以下最小代码示例在正常终止时(通过按Enter键)运行正常:

#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静态成员函数中定义为static)也是一个全局对象.

在C中,您无法控制构造顺序,也无法控制全局对象的破坏.因此,在SingletonLogClass之前可能会破坏cout对象.由于SingletonLogClass的析构函数记录了某些东西,它不能再使用cout(而printf很好).

当程序正常终止(按下回车)并因此退出主函数时,以及当程序通过关闭shell突然终止时的行为差异来自破坏全局变量的顺序.您无法控制全局对象的销毁顺序.

标签:access-violation,c
来源: https://codeday.me/bug/20190826/1735317.html