std::列表弹出和擦除方法无法销毁已删除的项目

std::list pop and erase method fails to destroy the removed item

本文关键字:项目 删除 方法 列表 std 擦除      更新时间:2023-10-16

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

   This effectively reduces the container size by the number of elements removed,
which are destroyed.

流行方法的类似描述。

但是在我对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("%dn", t->a);
   return 0;
}

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

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

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

如果你没有C++11,你可以使用Boost.PointerContainer或boost::shared_ptr。

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