std :: list pop和erase方法无法销毁已删除的项目

Rob*_*ean 2 c++ list std

http://www.cplusplus.com/reference/list/list/erase/上的描述中,我得到了

   This effectively reduces the container size by the number of elements removed,
which are destroyed.
Run Code Online (Sandbox Code Playgroud)

pop方法的类似描述.

但是在我对VS2012的测试中,删除的项目没有被破坏.我对此感到困惑.

这是我的测试代码.我仍然可以从std :: list删除的内存中输出,在我看来,这是错误的.

#include <stdio.h> 
#include <list>
using namespace std;
class test
{
public:
   int a;
   test() {a = 111;}
};
int main(void)
{
   list<test*> l;
   test* t = new test;
   l.push_back(t);
   l.erase(l.begin());
   printf("%d\n", t->a);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*dec 8

该项被销毁,即它的析构函数被调用.唉,指针的析构函数什么都不做.特别是,它不会删除指向的对象.

请记住,与Java和C#不同,C++具有所有内容的值语义,而指针和引用是您必须始终自己处理的显式构造.因此,销毁指针并删除指向的对象是不同的操作.

如果您有C++ 11,则std :: unique_ptr 在列表中可用,并确保删除指向的对象,但它不可复制以强制执行正确的内存管理.如果需要复制,可以使用(也是C++ 11)std :: shared_ptr,它可以被复制,但是有一些运行时开销.

如果您没有C++ 11,可以使用Boost.PointerContainerboost :: shared_ptr.

当然,大多数时候你不应该首先使用间接.在适用的C++中,首选按值操作对象.它特别适用于多态对象,但在实践中它们在C++中并不常见.

  • 我会添加更好的solition,在许多情况下,根本不使用任何类型的指针.我知道这只是测试代码,但`list <test>`必须是一个选项. (2认同)