我偶然发现了以下问题:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
class TestClass
{
public:
~TestClass();
};
TestClass::~TestClass()
{
fstream f;
}
TestClass test;
int _tmain(int argc, _TCHAR* argv[])
{
Sleep(10000);
}
这是一个简单的示例,以便您可以重现我的错误。一切正常,直到我在睡眠时手动关闭控制台窗口(通过在控制台角落按X)。
会引发访问冲突异常fstream f;
析构函数中的行。手动控制台关闭后有没有办法使用fstream?或者我做错了什么?
UPD:
Stack看起来像这样:
msvcp120d.dll!std::ctype<char>::widen(char _Byte) Line 2418
msvcp120d.dll!std::basic_ios<char,std::char_traits<char> >::widen(char _Byte) Line 129
msvcp120d.dll!std::basic_ios<char,std::char_traits<char> >::init(std::basic_streambuf<char,std::char_traits<char> > * _Strbuf, bool _Isstd) Line 170
msvcp120d.dll!std::basic_istream<char,std::char_traits<char> >::basic_istream<char,std::char_traits<char> >(std::basic_streambuf<char,std::char_traits<char> > * _Strbuf, bool _Isstd) Line 48
msvcp120d.dll!std::basic_iostream<char,std::char_traits<char> >::basic_iostream<char,std::char_traits<char> >(std::basic_streambuf<char,std::char_traits<char> > * _Strbuf) Line 954
ConsoleApplication6.exe!std::basic_fstream<char,std::char_traits<char> >::basic_fstream<char,std::char_traits<char> >() Line 1133
ConsoleApplication6.exe!TestClass::~TestClass() Line 19
答案 0 :(得分:0)
根据这个堆栈跟踪,问题确实来自fstream构造函数的调用:ios_base::init()
使用widen(' ')
初始化某个变量,该变量在可能的情况下调用ctype::widen
null或已销毁的ctype
对象(由use_facet
返回),在尝试调用虚拟成员函数时会导致崩溃。
结论:CRT中的一些重要对象在TestClass
对象之前被销毁,因此您无法在全局析构函数中使用CRT类型。