【问题标题】:std::list.remove is calling the destructor but doesn't delete itstd::list.remove 正在调用析构函数但不删除它
【发布时间】:2013-11-27 00:42:26
【问题描述】:

我遇到了 std::list 的问题。

std::list<Component*> mComponents;
//add some pointer in it
Component * comp = getComponent("positionComponent");
mComponents.remove(comp);

由于某种原因,它调用了 comp 指针的析构函数但没有删除它;通过析构函数删除的项目将被删除,而列表中的所有其他项目保持不变。什么会导致这种行为?

【问题讨论】:

  • 指针的析构函数什么都不做...
  • Remove 不会从列表中删除项目:stackoverflow.com/questions/799314/…
  • 不确定你说它调用析构函数但不删除它是什么意思...它调用Component::~Component(),但不释放内存?这段代码不应该调用Component::~Component(),因为它不会破坏Component,只是破坏Component*
  • @VladimirM std::list::remove 确实删除一个元素;我认为您指的是std::remove 通用迭代器算法。
  • 我认为这是我在编程中看到的最奇怪的事情。我认为 XCode 有问题,因为我整天都在不停地使用它。

标签: c++ c++11


【解决方案1】:

调用list.remove 确实调用了包含类型的析构函数,但在您的情况下,正在调用Component * 的析构函数,这是一个无操作。您必须手动找到该项目并 delete 删除它。

auto item = std::find(mComponents.begin(), mComponents.end(), comp);
if(item != mComponents.end()) {
  delete *item;
  mComponents.remove(item);
}

这就是为什么不建议在标准容器中粘贴原始指针的原因。您应该改用std::list&lt;std::unique_ptr&lt;Component&gt;&gt;unique_ptr 将为您调用托管对象上的delete

或者,如果您使用的是 C++11 之前的编译器,boost::ptr_list 是另一种选择。

【讨论】:

  • 即使我提出的问题根本没有意义(为什么指针会调用析构函数)。我猜这是导致意外行为的内存泄漏。我一直在考虑使用智能指针。在我开始添加这个惊人的功能之前,我只需要让代码工作。
  • @Gasim:如果每次从列表中删除项目时都需要删除它,显然列表拥有该项目。为什么不只是std::list&lt;Component&gt;?为什么要存储指针?
  • 你的意思是delete *item;
猜你喜欢
  • 2013-09-30
  • 2012-03-13
  • 2013-11-16
  • 2014-12-27
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多