std::list 的擦除成员函数是否为所有存储的元素调用析构函数?

Does std::list's erase member function call the destructor for all stored elements?

本文关键字:存储 元素 析构函数 调用 是否 擦除 list 成员 函数 std      更新时间:2023-10-16

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

在阅读std::list::erase的文档时,我看到了以下语句:

"这有效地减少了容器的大小,减少了被销毁的元素数量。"

我很难理解这句话。举个例子,考虑一下这个设置:

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

现在,假设我调用mylist.erase(iterator of list)。我原以为这会调用类demo的析构函数,但似乎没有,这似乎与的"which are destroyed"语句相矛盾

你能帮我做这个吗?

谢谢!

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

现在,另一方面,假设您有一个list<unique_ptr<demo>>。在这种情况下,调用clear()将销毁列表中的所有unique_ptr<demo>。这反过来又会解除分配unique_ptr指向的对象,因为销毁unique_ptr也会销毁它指向的对象。这之所以有效,是因为unique_ptr有所有权的概念,并意识到当它自己被销毁时,它需要销毁它所指的对象。

希望这能有所帮助!

为了澄清,擦除()也以clear()的方式销毁元素。

// Removes the element from the list and destroys it:
mylist.erase(iterator);