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

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

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

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

"This effectively reduces the container size by the number of elements removed, which are destroyed."

我很难理解这个说法。例如,请考虑以下设置:

class demo {

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

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

的声明相矛盾

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

谢谢!

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

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

希望对您有所帮助!

澄清一下,erase() 也以与 clear() 相同的方式销毁元素。

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