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

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



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

class demo {

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

现在,假设我叫mylist.erase(iterator of list)。我认为这将调用类demo的析构函数,但似乎没有,这似乎与“已被破坏”的说法相矛盾。

你能帮我吗?

谢谢!

最佳答案

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

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

希望这可以帮助!

09-04 16:11
查看更多