0

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

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

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

d_list_p->clear();
delete d_list_p;

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

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

可能值得一提的是,这个删除语句是用 C++ 代码编写的,该代码被构建到 .NET DLL 中,因此程序以混合模式运行。

4

3 回答 3

4

d_list_p班级成员吗?而且,那个班级是否遵守三规则

如果没有,那么(副本)d_list_p可能已经被删除。

于 2011-09-08T17:02:32.273 回答
3

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

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

于 2011-09-08T16:56:18.080 回答
0

当您调用 时,Windows 会仔细检查堆delete,因此该delete行正在查找错误,而不是创建错误。错误在上面的行中。
大多数堆损坏是由 (A) 调用 delete 太多次 (B) 调用错误形式的 delete 或 (C) 访问堆分配的数组超出范围引起的。我们可以看到 A 和 B 不是问题,所以它可能是 C。查找数组访问,并围绕它们断言以验证范围。

于 2011-09-08T17:06:59.717 回答