在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;
}
答案 0 :(得分:8)
该项目已被销毁,即它的析构函数被称为。唉,指针的析构函数什么都不做。特别是,它不会删除指向的对象。
请记住,与Java和C#不同,C ++对于所有内容都具有值语义,而指针和引用是您必须始终自己处理的显式构造。因此,销毁指针并删除指向的对象是不同的行为。
如果你有C ++ 11,那么std::unique_ptr is usable in list将确保删除指向的对象,但是它不可复制以强制执行正确的内存管理。如果你需要复制,你可以使用(也是C ++ 11)std::shared_ptr,它可以复制,但有一些运行时开销。
如果您没有C ++ 11,可以使用Boost.PointerContainer或boost::shared_ptr。
当然,大多数时候你不应该首先使用间接。在适用的C ++中,首选按值操作对象。它特别适用于多态对象,但在实践中它们在C ++中并不常见。