在wifstream析构函数中中止

时间:2018-03-21 17:43:08

标签: c++ abort codecvt

执行return时,以下C ++代码会出现一个神秘错误(“Debug Error!... abort()已被调用”)。这是Visual Studio 2017 15.6.3,该程序是64位调试版本,在64位Windows 7下运行。导致此错误的原因是什么,以及如何解决?

wifstream inFile;

std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian> cv1;
inFile.imbue(std::locale(inFile.getloc(), &cv1));
return 0;

使用调试器进行跟踪显示消息来自反汇编程序指令

call        std::basic_ifstream<wchar_t,std::char_traits<wchar_t> >::`vbase destructor'

堆栈上的最后一个条目,msvcp140d.dllvcruntime140d.dllucrtbased.dll除外

    MyApp.exe!std::basic_ifstream<wchar_t,std::char_traits<wchar_t> >::`vbase destructor'() C++

此代码的目的是输入文件infile是Unicode(little-endian),我将其读入std::string变量。

1 个答案:

答案 0 :(得分:1)

std::locale维护与其关联的每个方面的引用计数。您正在调用的std::locale构造函数将增加您传入的std::codecvt_utf16对象的引用计数,然后std::locale的析构函数将减少该引用计数。当std::codecvt_utf16的引用计数降为0时,它将通过delete运算符销毁。这就是为什么你得到中止错误 - 当std::wifstream析构函数正在清理imbue'd语言环境时,语言环境的析构函数会尝试delete未使用{new分配的内容1}}运算符开头。

请改为:

inFile.imbue(std::locale(inFile.getloc(),
    new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));

请参阅std::codecvt_utf16上的cppreference.com文档中的示例。