在硬件控制台/ c ++之后的fstream声明异常

时间:2014-09-18 14:32:14

标签: c++ console fstream

我偶然发现了以下问题:

#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

1 个答案:

答案 0 :(得分:0)

根据这个堆栈跟踪,问题确实来自fstream构造函数的调用:ios_base::init()使用widen(' ')初始化某个变量,该变量在可能的情况下调用ctype::widen null或已销毁的ctype对象(由use_facet返回),在尝试调用虚拟成员函数时会导致崩溃。

结论:CRT中的一些重要对象在TestClass对象之前被销毁,因此您无法在全局析构函数中使用CRT类型。