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

Using delete on pointer to std::list?

本文关键字:delete 指针 list std      更新时间:2023-10-16

在我的程序中,我有一个指向std::list对象的指针,它是这样分配的。

d_list_p = new std::list<some_type*>();

然后在我的程序中,我像这样删除它。

d_list_p->clear();
delete d_list_p;

由于某种原因,我在删除语句上触发了一个Windows断点。如果我在delete语句处中断,我看到列表存在并且大小为0。此外,我从不为抛出错误的情况添加元素到列表中(我认为)。

代码正在用VS2005的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++

可能值得一提的是,这个删除语句是在c++代码中被构建到。net DLL中,所以程序是在混合模式下运行的。

d_list_p是一个类的成员吗?那门课遵守"三原则"吗?

如果没有,那么d_list_p的(一个副本)可能已经被删除了

您需要迭代列表并删除其中的所有单个指针,因为如果您不这样做,就会泄漏它们。

为什么要创建指向std::list的指针?使用std::list<mytype> mylist;

Windows在调用delete时对堆进行双重检查,因此delete行是查找错误,而不是创建它。错误在上面的行中。
大多数堆损坏是由以下原因造成的:(A)多次调用delete (B)调用错误的delete形式,或(C)越界访问堆分配的数组。我们可以看到A和B不是问题,所以它可能是c。找到数组访问,并包围它们断言以验证范围。