std::list 的擦除成员函数是否为所有存储的元素调用析构函数?
Does std::list's erase member function call the destructor for all stored elements?
我正在调试一个内存问题,它与std::list::erase
方法有一些关系。
在阅读std::list::erase
的文档时,我看到了以下语句:
"这有效地减少了容器的大小,减少了被销毁的元素数量。"
我很难理解这句话。举个例子,考虑一下这个设置:
class demo {
};
std::list<demo *> mylist;
现在,假设我调用mylist.erase(iterator of list)
。我原以为这会调用类demo
的析构函数,但似乎没有,这似乎与的"which are destroyed"语句相矛盾
你能帮我做这个吗?
谢谢!
当您调用列表的clear()
方法时,它将销毁存储在列表中的所有对象。在您的情况下,您有一个demo*
s的列表。这意味着每个指针都将被销毁,因为指示器存储在列表中,但尖端不会被销毁,原因是尖点不存储在列表内。换句话说,销毁指针与在每个指针上调用delete
不同。因此,如果原始指针拥有它们所指向的对象,通常不建议将这些指针存储在容器类型中,因为正如您刚刚看到的,析构函数不是自动调用的。
现在,另一方面,假设您有一个list<unique_ptr<demo>>
。在这种情况下,调用clear()
将销毁列表中的所有unique_ptr<demo>
。这反过来又会解除分配unique_ptr
指向的对象,因为销毁unique_ptr
也会销毁它指向的对象。这之所以有效,是因为unique_ptr
有所有权的概念,并意识到当它自己被销毁时,它需要销毁它所指的对象。
希望这能有所帮助!
为了澄清,擦除()也以clear()的方式销毁元素。
// Removes the element from the list and destroys it:
mylist.erase(iterator);
相关文章:
- 如何从存储在std::映射中的std::集中删除元素
- 带结构的二维矢量:如何存储元素
- C++将字符串数组的元素存储到变量中
- 数组对象的生存期是否在重用其元素存储时结束?
- 存储指向动态数组元素的指针
- 在固定大小的向量中存储指向元素的指针
- std::unordered_set 中的元素如何存储在C++内存中?
- 地图是否将元素存储为 std::p air?
- C++:矩阵高斯消除不起作用:使用单维数组来存储元素
- 如何在C++中将.csv文件的元素存储到二维向量中?
- 多集如何存储重复元素?
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- OpenCV 文件存储 - 错误:元素之间的解析错误 (icvYMLParseValue) 缺失
- 存储 std::list 元素的地址;内存
- std::unordered_map如何存储和比较其密钥,以实现无需订购即可快速访问元素?
- 指向对象表示元素或指向提供的存储元素的指针
- 在数组中存储元素时出错
- 在unordered_set中存储元素与在unordered_map中存储元素
- 用于按排序顺序存储元素并允许快速索引的数据结构