在wifstream析构函数中止

问题描述 投票:0回答:1

执行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变量。

c++ abort codecvt
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>));

请参阅std::codecvt_utf16cppreference.com文档中的示例。

© www.soinside.com 2019 - 2024. All rights reserved.