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

时间:2015-06-24 22:09:17

标签: c++ list pointers std destructor

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

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

  

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

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

class demo {

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

现在,假设我拨打mylist.erase(iterator of list)。我认为这会调用类demo的析构函数,但它似乎没有,这似乎与“被销毁的”语句相矛盾。

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

希望这有帮助!