0

以下 C++ 代码在执行时出现神秘错误(“调试错误!...abort() 已被调用”)return。这是 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.dllucrtbased.dll

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

这段代码的目的是输入文件infile是 Unicode(小端),我正在将它读入一个std::string变量。

4

1 回答 1

1

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>));

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

于 2018-03-21T18:03:26.503 回答