我在主程序末尾遇到了奇怪的访问冲突,其原因是我在发现某些困难时遇到了麻烦。

关闭我的应用程序时,出现以下访问冲突:

调试器

        // 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

任何人都知道什么可能导致这种情况?

我读到有关缓存方面的内容,不确定是否相关?

最佳答案

内存损坏错误可能(显然)会导致这种(以及许多其他类型)故障。

您是否尝试过使用valgrind(memcheck)或Rational Purify来解决此问题?它可能会报告该问题(如果这是您第一次在代码库上进行这种检查,则可能会包含很多其他信息。您仍将希望设计一个最小的“主要”实现,以将行为展现给您。在内存和边界检查器下运行

$ 0.02

PS。以防万一,通常会出现内存损坏错误

通过取消引用过时的指针(在释放/删除之后)


  • 通过在已分配缓冲区
  • 的末尾写入来写入
  • 通过释放/删除先前的指针(主要是所有权跟踪错误的症状)来实现

    关于c++ - _DebugHeapDelete终止访问冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5559357/

  • 10-12 17:40