执行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.dll
,vcruntime140d.dll
和ucrtbased.dll
之外
MyApp.exe!std::basic_ifstream<wchar_t,std::char_traits<wchar_t> >::`vbase destructor'() C++
这段代码的目的是输入文件infile
是Unicode(little-endian),我将它读入std::string
变量。
std::locale
维护与其相关的每个方面的引用计数。你正在调用的std::locale
构造函数将增加你传入的std::codecvt_utf16
对象的引用计数,然后std::locale
的析构函数将减少该引用计数。当std::codecvt_utf16
的引用计数降为0时,它将通过delete
运算符销毁。这就是为什么你得到中止错误 - 当std::wifstream
析构函数清理imbue
'd语言环境时,语言环境的析构函数尝试使用delete
操作符开始的new
。
改为:
inFile.imbue(std::locale(inFile.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
请参阅std::codecvt_utf16
上cppreference.com文档中的示例。