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

时间:2013-09-26 08:21:32

标签: 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.

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;
}

1 个答案:

答案 0 :(得分:8)

该项目已被销毁,即它的析构函数被称为。唉,指针的析构函数什么都不做。特别是,它不会删除指向的对象。

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

如果你有C ++ 11,那么std::unique_ptr is usable in list将确保删除指向的对象,但是它不可复制以强制执行正确的内存管理。如果你需要复制,你可以使用(也是C ++ 11)std::shared_ptr,它可以复制,但有一些运行时开销。

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

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