我正在调试一个内存问题,它与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
具有所有权的概念,并且意识到它需要在销毁自身时销毁指向的对象。
希望这可以帮助!