我正在调试一个与std::list::erase
方法有一定关系的内存问题。
在阅读std::list::erase
的文档时,我看到了this statement:
“这有效地减少了容器大小,删除了被删除的元素数量。”
我很难理解这句话。例如,请考虑以下设置:
class demo {
};
std::list<demo *> mylist;
现在,假设我拨打mylist.erase(iterator of list)
。我认为这会调用类demo
的析构函数,但它似乎没有,这似乎与“被销毁的”语句相矛盾。
你能帮我解决这个问题吗?
谢谢!
答案 0 :(得分:3)
当您调用列表的clear()
方法时,它将销毁列表中存储的所有对象。在您的情况下,您有一个demo*
的列表这意味着每个指针都将被销毁,因为指针存储在列表中,但是 pointees 不会被销毁,因为 pointees 不会存储在列表中。换句话说,销毁指针与在每个指针上调用delete
相同。因此,如果这些指针拥有它们指向的对象,通常不建议将原始指针存储在容器类型中,因为正如您刚刚看到的那样,析构函数不会被自动调用。
现在,另一方面,假设你有list<unique_ptr<demo>>
。在这种情况下,调用clear()
将销毁列表中的所有unique_ptr<demo>
。这反过来将释放unique_ptr
指向的对象,因为销毁unique_ptr
也会破坏它所指向的对象。这是有效的,因为unique_ptr
具有所有权的概念,并意识到它需要销毁它本身被销毁时指向的对象。
希望这有帮助!