我正在调试一个内存问题,它与std::list::erase
方法有关。
在阅读的文档时std::list::erase
,我看到了以下声明:
“这有效地减少了容器尺寸,减少了被破坏的元素的数量。”
我很难理解这一说法。例如,请考虑以下设置:
class demo {
};
std::list<demo *> mylist;
现在,假设我打电话给mylist.erase(iterator of list)
。我以为这将调用class的析构函数demo
,但似乎没有,这似乎与“被摧毁”的说法相矛盾。
你能帮我吗?
谢谢!
当您调用clear()
列表的方法时,它将破坏存储在列表内部的所有对象。你的情况,你有一个列表demo*
s此意味着每一个的三分球将被销毁,因为指针存储在列表中,但指针对象不会被破坏,因为指针对象不会存储在列表内。换句话说,销毁指针与调用delete
这些指针中的每一个都不相同。因此,如果原始指针拥有它们指向的对象,通常不建议将原始指针存储在容器类型中,因为如您所见,析构函数不会自动调用。
现在,另一方面,假设您有一个list<unique_ptr<demo>>
。在这种情况下,调用clear()
将销毁unique_ptr<demo>
列表中的所有。反过来,这将释放unique_ptr
s所指向的对象,因为销毁aunique_ptr
也会销毁它所指向的对象。之所以unique_ptr
可行,是因为拥有所有权的想法,并且意识到当对象本身被销毁时,它需要销毁它所指向的对象。
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句