_DebugHeap删除终止时的访问冲突
我在主要结束时遇到了一个奇怪的访问冲突,其原因是我遇到了一些困难。
关闭我的应用程序时,我在以下方面遇到访问冲突:
Xdebug的
// TEMPLATE FUNCTION _DebugHeapDelete
template<class _Ty>
void __CLRCALL_OR_CDECL _DebugHeapDelete(_Ty *_Ptr)
{ // delete from the debug CRT heap even if operator delete exists
if (_Ptr != 0)
{ // worth deleting
_Ptr->~_Ty();
// delete as _NORMAL_BLOCK, not _CRT_BLOCK, since we might have
// facets allocated by normal new.
free(_Ptr); // **ACCESS VIOLATION**
}
}
堆栈跟踪:
> msvcp100d.dll!std::_DebugHeapDelete<void>(void * _Ptr) Line 62 + 0xa bytes C++
msvcp100d.dll!std::numpunct<char>::_Tidy() Line 190 + 0xc bytes C++
msvcp100d.dll!std::numpunct<char>::~numpunct<char>() Line 122 C++
msvcp100d.dll!std::numpunct<char>::`scalar deleting destructor'() + 0x11 bytes C++
msvcp100d.dll!std::_DebugHeapDelete<std::locale::facet>(std::locale::facet * _Ptr) Line 62 C++
msvcp100d.dll!std::_Fac_node::~_Fac_node() Line 23 + 0x11 bytes C++
msvcp100d.dll!std::_Fac_node::`scalar deleting destructor'() + 0x11 bytes C++
msvcp100d.dll!std::_DebugHeapDelete<std::_Fac_node>(std::_Fac_node * _Ptr) Line 62 C++
msvcp100d.dll!_Fac_tidy() Line 41 + 0x9 bytes C++
msvcp100d.dll!std::_Fac_tidy_reg_t::~_Fac_tidy_reg_t() Line 48 + 0xe bytes C++
msvcp100d.dll!std::`dynamic atexit destructor for '_Fac_tidy_reg''() + 0xf bytes C++
msvcp100d.dll!_CRT_INIT(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 415 C
msvcp100d.dll!__DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 526 + 0x11 bytes C
msvcp100d.dll!_DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 476 + 0x11 bytes C
任何人都有任何想法可能导致这个?
我读过有关缓存的方面的内容,不确定这些内容是否相关?
没有找到相关结果
已邀请:
4 个回复
容淑阔九
弦砂牧扁
因为iostream是模板所以_Fac_node的新内容使用你的运算符new。但是当退出时,你的内存池可能会在_Fac_tidy之前退出,然后当~_Fac_tidy()运行时,程序崩溃了。
磐剩
峨躬坎抬焚
代码被调用,但此时
已经有错误的值。因此,有一些代码已经在此指针下释放了对象,或者设置了一个退出钩子以释放未初始化的对象。 如果定义了
,则可以将
代码编译到加载到应用程序进程中的其他模块中。然后,可以在msvcp100d.dll中的另一个模块之前调用这些模块的一个退出过程,因此通常可以释放构面对象。在我的例子中,定义了
,编译了两个模块(exe和clr dll)。 VC ++ 8,9的解决方案 检查存在
的“命令行”部分中的最终编译器选项。取消定义
并重新编译受影响的模块可在程序终止时修复AV。 关于
的注意事项 对于VC ++9
,在MSDN上,有一个注释
预处理器定义和组合的组合 不支持
或
编译器选项。 对于更高的VS版本,没有提及
。 对于更高的VS版本和特别是VS 10,我认为依赖于
的代码仍然存在。在TS的情况下,如果在包含
的任何TU的编译器选项或包括
的其他头文件中仍然使用
,则这种不正确的组合可能导致AV。