我正在调试一个内存问题,它与 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)
。我以为这会调用 demo
类的析构函数,但似乎并没有,这似乎与“which are destroyed”的说法相矛盾。
你能帮我解决这个问题吗?
谢谢!
最佳答案
当您调用 clear()
列表的方法,它将销毁列表中存储的所有对象。在您的情况下,您有一个列表 demo*
s 这意味着每个 pointers 都将被销毁,因为 pointers 存储在列表中,但 pointees 不会被销毁因为 pointees 没有存储在列表中。换句话说,销毁指针与调用 delete
不同。在每个指针上。因此,如果原始指针拥有它们指向的对象,通常不建议将原始指针存储在容器类型中,因为正如您刚刚看到的那样,不会自动调用析构函数。
现在,另一方面,假设您有一个 list<unique_ptr<demo>>
.在这种情况下,调用 clear()
将销毁所有 unique_ptr<demo>
在列表中。这反过来将释放 unique_ptr
中的对象。 s point at,因为摧毁了一个unique_ptr
也会破坏它指向的对象。这是有效的,因为 unique_ptr
有所有权的想法,并意识到它需要在它自己销毁时销毁它指向的对象。
希望这对您有所帮助!
关于c++ - std::list 的 erase 成员函数是否为所有存储的元素调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038010/