在C++/CLI中使用std::basic_ifstream::get()时出现visual AccessViolati

visual AccessViolationException when using std::basic_ifstream::get() in C++/CLI, why?

本文关键字:get AccessViolati visual ifstream basic CLI C++ std      更新时间:2023-10-16

当我尝试运行这个时:

#include <tchar.h>
#include <fstream>
int _tmain(int argc, TCHAR *argv[])
{
    std::basic_ifstream<TCHAR> file("TestInput.txt");
    file.get();
}

我得到了一个带有以下堆栈跟踪的AccessViolationException

ntdll.dll!_RtlpWaitOnCriticalSection@8()  + 0xae bytes  
ntdll.dll!_RtlpEnterCriticalSectionContended@4()  + 0xa1 bytes  
ntdll.dll!_RtlEnterCriticalSection@4()  - 0x1f885 bytes 
msvcr120.dll!__lock_file()  + 0x2ce45 bytes 
[Managed to Native Transition]  
MyProject.exe!std::basic_filebuf<char,std::char_traits<char> >::_Lock() Line 355    C++
msvcp120d.dll!std::basic_istream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base()  + 0x55 bytes  
msvcp120d.dll!std::basic_istream<char,std::char_traits<char> >::sentry::sentry()  + 0x32 bytes  
msvcp120d.dll!std::basic_istream<char,std::char_traits<char> >::get()  + 0x5c bytes 
[Managed to Native Transition]  
MyProject.exe!wmain(int argc = 0x2, wchar_t** argv = 0x054AA3F8) [line # removed]   C++
MyProject.exe!__tmainCRTStartup()    [line # removed]   C
[Managed to Native Transition]  
mscoreei.dll!__CorExeMain@0()  + 0x71 bytes 
mscoree.dll!_ShellShim__CorExeMain@0()  + 0x227 bytes   
mscoree.dll!__CorExeMain_Exported@0()  + 0x8 bytes  
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes   
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes    

为什么会发生这种情况,以及在尝试读取文件时如何避免这种情况?

这是因为我使用_DEBUG宏进行编译(从本机转换之前遗留下来的)。移除它解决了问题。

听起来宏正在做一些意想不到的事情。当您需要弄清楚Visual C++中发生了什么时,让它转储预处理器的输出。此处记录了有关此操作的详细信息。