2

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

1 回答 1

8

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

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

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

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

当然,大多数时候你根本不应该使用间接。在适用的情况下,在 C++ 中首选按值操作对象。它尤其不适用于多态对象,但实际上它们在 C++ 中并不常见。

于 2013-09-26T08:23:31.720 回答