在指向std :: list的指针上使用delete?

时间:2011-09-08 16:53:37

标签: c++ memory-management stdlist

在我的程序中,我有一个指向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 ++代码,因此该程序以混合模式运行。

3 个答案:

答案 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.查找数组访问,并将它们包围以验证范围。