在我的程序中,我有一个指向std::list
对象的指针,它是这样分配的。
d_list_p = new std::list<some_type*>();
然后在我的程序中,我将其删除。
d_list_p->clear();
delete d_list_p;
出于某种原因,我在delete语句上触发了Windows断点。如果我在delete语句中断,我看到列表存在并且大小为0.此外,我从不在列表中添加一个元素来引发错误(我认为)。
使用VS VC5的MS VC ++编译器编译代码。
错误消息显示Windows触发了一个断点,指示内存损坏。堆栈跟踪说明如下。
ntdll.dll!DbgBreakPoint()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x6735 bytes
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x6b72 bytes
ntdll.dll!RtlpNtMakeTemporaryKey() + 0x7d5a bytes
ntdll.dll!LdrAlternateResourcesEnabled() + 0x33bd bytes
ntdll.dll!RtlpUnWaitCriticalSection() + 0x65b bytes
msvcr80.dll!free() + 0xcd bytes
FM_Access_Library_NET.dll!std::list<FM_Access_Library::Logger_Callbacks *,std::allocator<FM_Access_Library::Logger_Callbacks *> >::`scalar deleting destructor'() + 0x20 bytes C++
值得一提的是,这个删除语句是用于构建到.NET DLL中的C ++代码,因此该程序以混合模式运行。
答案 0 :(得分:4)
d_list_p
是班级成员吗?那个班级是否会观察Rule of Three?
如果没有,那么({1}}的副本可能已被删除。
答案 1 :(得分:3)
您需要迭代列表并删除其中的所有单个指针,因为如果不这样做,则会泄漏它们。
为什么要创建指向std :: list的指针?只需使用std::list<mytype> mylist;
答案 2 :(得分:0)
Windows在您调用delete
时双重检查堆,因此delete
行发现错误,而不是创建错误。错误在上面的行中
大多数堆损坏是由(A)调用delete太多次(B)调用错误的delete形式,或(C)访问堆分配的数组超出范围引起的。我们可以看到A和B不是问题,所以它可能是C.查找数组访问,并将它们包围以验证范围。