【问题标题】:Does std::list's erase member function call the destructor for all stored elements?std::list 的擦除成员函数是否为所有存储元素调用析构函数?
【发布时间】:2015-09-11 07:57:39
【问题描述】:

我正在调试一个与std::list::erase 方法有关的内存问题。

在阅读std::list::erase 的文档时,我看到了this statement

“这有效地减少了容器大小,减少了被删除的元素数量。”

我很难理解这句话。例如,考虑以下设置:

class demo {

};
std::list<demo *> mylist;

现在,假设我打电话给mylist.erase(iterator of list)。我以为这会调用类 demo 的析构函数,但似乎没有,这似乎与“已销毁”的说法相矛盾。

你能帮我解决这个问题吗?

谢谢!

【问题讨论】:

  • 指针被销毁(这是一个无操作)。指针不是。 (这是一个很好的例子,说明为什么你不应该使用拥有原始指针——尤其是它们的容器。)

标签: c++ list pointers std destructor


【解决方案1】:

当您调用列表的clear() 方法时,它将销毁存储在列表中的所有对象。在您的情况下,您有一个 demo*s 列表,这意味着每个 pointers 都将被销毁,因为 pointers 存储在列表中,但 em>pointees 不会被销毁,因为 pointees 没有存储在列表中。换句话说,销毁指针与在每个指针上调用delete 不同。因此,如果这些指针拥有它们所指向的对象,通常不建议将原始指针存储在容器类型中,因为正如您刚刚看到的那样,不会自动调用析构函数。

现在,另一方面,假设您有一个list&lt;unique_ptr&lt;demo&gt;&gt;。在这种情况下,调用clear() 将销毁列表中的所有unique_ptr&lt;demo&gt;s。这反过来将释放unique_ptrs 指向的对象,因为销毁unique_ptr 也会销毁它指向的对象。这是有效的,因为unique_ptr 有所有权的概念,并意识到它需要在它本身被销毁时销毁它指向的对象。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多