std::列表弹出和擦除方法无法销毁已删除的项目
std::list pop and erase method fails to destroy the removed item
在 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++实践中并不常见。
相关文章:
- 从链接列表c++中删除一个项目
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 如何自动获取我的项目的路径并删除一些文件
- 如何从 CLion 的运行窗口中删除程序项目路径
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- C++ 从链表中删除项目时出现问题
- 仅从无序集合中删除一个项目
- Visual studio安装项目删除以前的版本
- 如何使用擦除和迭代器来删除二维向量中的项目
- 从 std::vector 中删除项目时"Iterator not incrementable"
- C++ priority_queue与自定义比较器并删除任何项目
- 从 QTreeView 中删除项目时取消选择所有行
- 如果为空,则从 QListWidget 中删除可编辑项目
- 从传递给新线程C++的矢量中删除项目
- C++ 链表删除了错误的项目
- 删除并清除组合框 Win32 API 中的所有项目
- 删除 iOS 项目中的 SDLKey 引用
- 如何将项目属性设置为删除警告MSB8004:中间目录不会以落后的斜线结束
- 如何创建一个函数,该函数可以从一个qtreewidget中删除项目并将其添加到另一个函数
- 在拖放 QML 列表中插入/删除项目使用 cpp 模型查看