【问题标题】:Does Clear() method of STL containers calls delete on heap objects? [duplicate]STL 容器的 Clear() 方法是否在堆对象上调用 delete? [复制]
【发布时间】:2012-05-01 10:57:53
【问题描述】:

可能重复:
Does std::vector.clear() do delete (free memory) on each element?

我有一张地图,其中第二个元素是堆分配的。

我应该在迭代时显式调用delete 还是方法erase()clear() 为我这样做?

这是我的析构函数,它会删除分配给 new 的第二个元素

        ~Event()
        {
            auto iter = mapper.begin();
            while (iter != mapper.end())
            {                   
                mapper.erase(iter++); // heap object
            }
        }

【问题讨论】:

  • “我有一张地图,其中第二个元素是堆分配的”。可能你的意思是你有一个映射,其中第二个(值)元素是指针,它指向你从堆中分配的东西?如果容器的元素具有指针类型,则元素就是指针。他们可能指向或未指向的任何东西都不是容器的一部分,当然也不是容器的元素。

标签: c++ dictionary iterator delete-operator


【解决方案1】:

您必须在每个 new 元素上显式调用 delete
标准库容器不获取分配给指针的动态内存的所有权。

如果您需要自动清理,您应该使用智能指针作为容器元素。

【讨论】:

  • 你是怎么这么快找到答案的?也许是书签?
  • @codekiddy 这叫了解你的东西,这就是工匠所做的。
  • @codekiddy:每个体面的 C++ 程序员都知道这一点,无需书签或搜索......
【解决方案2】:

不,不会。您必须自己致电delete(或使用智能指针)。

【讨论】:

  • 我听说智能指针对 STL 容器不好,所以我将使用 delete :(
  • @codekiddy 旧的std::auto_ptr 很麻烦。新的std::shared_ptr 等人都很好。
猜你喜欢
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多