在 wifstream 析构函数中中止
Abort in wifstream destructor
以下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.dll
和 ucrtbased.dll
之外是
MyApp.exe!std::basic_ifstream<wchar_t,std::char_traits<wchar_t> >::`vbase destructor'() C++
这段代码的目的是输入文件infile
是Unicode(小端序(,我正在将其读入std::string
变量中。
>std::locale
维护与其关联的每个方面的引用计数。 您正在调用的构造函数std::locale
将递入您传入的std::codecvt_utf16
对象的引用计数递增,然后 std::locale
的析构函数将递减该引用计数。 当std::codecvt_utf16
的引用计数下降到 0 时,它将通过 delete
运算符销毁。 这就是您收到中止错误的原因 - 当std::wifstream
析构函数清理imbue
的区域设置时,区域设置的析构函数会尝试delete
未与new
运算符一起分配的内容。
请改为执行以下操作:
inFile.imbue(std::locale(inFile.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
请参阅有关 cppreference.com 的std::codecvt_utf16
文档中的示例。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 在 wifstream 析构函数中中止