std::list 的 erase 成员函数是否为所有存储的元素调用析构函数?
Does std::list's erase member function call the destructor for all stored elements?
我正在调试一个内存问题,它与 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)
。我以为这会调用 class demo
的析构函数,但似乎并没有,这似乎与 "which are destroyed."
的声明相矛盾
你能帮我解决这个问题吗?
谢谢!
当你调用列表的clear()
方法时,它会销毁存储在列表中的所有对象。在你的例子中,你有一个 demo*
s 的列表 这意味着每个 pointers 都将被销毁,因为 pointers 是存储在列表中,但 pointees 不会被销毁,因为 pointees 未存储在列表中。换句话说,销毁指针与在每个指针上调用 delete
不同。因此,如果原始指针拥有它们指向的对象,通常不建议将原始指针存储在容器类型中,因为正如您刚刚看到的那样,不会自动调用析构函数。
现在,另一方面,假设您有一个 list<unique_ptr<demo>>
。在这种情况下,调用 clear()
将销毁列表中的所有 unique_ptr<demo>
。这反过来会释放 unique_ptr
指向的对象,因为销毁 unique_ptr
也会销毁它指向的对象。这是有效的,因为 unique_ptr
有所有权的想法,并意识到它需要在它自己被销毁时销毁它指向的对象。
希望对您有所帮助!
澄清一下,erase() 也以与 clear() 相同的方式销毁元素。
// Removes the element from the list and destroys it:
mylist.erase(iterator);
我正在调试一个内存问题,它与 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)
。我以为这会调用 class demo
的析构函数,但似乎并没有,这似乎与 "which are destroyed."
你能帮我解决这个问题吗?
谢谢!
当你调用列表的clear()
方法时,它会销毁存储在列表中的所有对象。在你的例子中,你有一个 demo*
s 的列表 这意味着每个 pointers 都将被销毁,因为 pointers 是存储在列表中,但 pointees 不会被销毁,因为 pointees 未存储在列表中。换句话说,销毁指针与在每个指针上调用 delete
不同。因此,如果原始指针拥有它们指向的对象,通常不建议将原始指针存储在容器类型中,因为正如您刚刚看到的那样,不会自动调用析构函数。
现在,另一方面,假设您有一个 list<unique_ptr<demo>>
。在这种情况下,调用 clear()
将销毁列表中的所有 unique_ptr<demo>
。这反过来会释放 unique_ptr
指向的对象,因为销毁 unique_ptr
也会销毁它指向的对象。这是有效的,因为 unique_ptr
有所有权的想法,并意识到它需要在它自己被销毁时销毁它指向的对象。
希望对您有所帮助!
澄清一下,erase() 也以与 clear() 相同的方式销毁元素。
// Removes the element from the list and destroys it:
mylist.erase(iterator);