执行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
变量。
答案 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文档中的示例。