在指向std::list的指针上使用delete
Using delete on pointer to std::list?
在我的程序中,我有一个指向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。找到数组访问,并包围它们断言以验证范围。
相关文章:
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- C++原始指针和"delete"
- 基类指针:在哪里使用 new 和 delete
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- 为什么在C++中使用delete后指针不为NULL
- delete运算符如何处理c中的指针
- C++:为什么可以在没有事先使用 new 的情况下在指向结构的指针上使用 delete?
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 这些指针中的哪一个需要免费()或delete()
- 对不完整类型的空指针调用delete合法吗
- ::运算符 delete(指针) 返回释放的字节大小
- 复制指针,然后调用 delete
- 在delete()之后不会断言两个指针都指向NULL
- Delete无法识别列表中的指针分配
- delete不会将0分配给指针
- 在“delete”之后重复使用指针
- 如果我对对象调用 delete,矢量中的对象指针是否被删除
- 在c++中,Delete指针和重新分配给出了相同的结果
- 什么是delete指针,指针=0;表述功?它清除内存两次吗?
- 指针错误,在delete[]指针中中断