我们说我有这个简单的代码:
std::list<Class*> mList
mList.insert(mList.begin(), new Class())
我是否需要担心手动取消分配新的Class元素,或者如果我使用erase(),它是否由List来处理?
答案 0 :(得分:5)
你创造了它,你需要销毁它。
我的建议是尽可能避免这种情况(通常是这样)。将值放在列表中(通常更可取)或考虑使用boost::ptr_list
。或者,您可能会考虑类似std::list<std::unique_ptr<Class>>
。
请注意,std::list
和std::vector
之间在您需要做出的决定方面存在重大差异。仅举一个非常明显的例子,在vector
中,您需要计划集合中的对象随着集合的增长而被复制/移动的事实。这可以排除在某些情况下存储对象。但是,使用std::list
时,不需要或不需要复制/移动。列表中的每个节点都是单独分配的,一旦分配,它就不会被复制或移动。事实上,这是首先使用列表的最大原因之一。
因此,即使你的Class
定义了一个永远无法复制或移动的身份对象,在列表中按值存储它仍然完全没问题(即使你在{{{1}中也不能这样做{1}})。
答案 1 :(得分:4)
是的,在此示例中,从列表中删除列表或列表被销毁之前,您必须delete
列表中的所有元素。
这就是为什么你应该使用std::unique_ptr
- 这将确保它自动发生。
答案 2 :(得分:-1)
使用智能指针,它会根据需要释放内存。
#include <memory>
https://www.google.com/amp/s/www.geeksforgeeks.org/smart-pointers-cpp/amp/