当前位置: 首页 > 知识库问答 >
问题:

如果std::vector元素“提交自杀”(使用delete this;)会发生什么?

贺博厚
2023-03-14
vector<Item*> items; //{item1, item2, item3}
items[1]->suicide();
void Item::suicide()
{
   delete this;
}

编辑2:谢谢所有的答案!太棒了.所以我最终决定并找到了从对象外部进行的方法,因为这是一种糟糕的实践,而且不必要地复杂

共有1个答案

廉雅惠
2023-03-14

什么是项目向量的大小和它是如何排列的?一样的。函数调用根本不改变向量的内容和大小。它只是释放指针指向的内存。

这样可以吗?更准确地说:它是合法的C++吗?是的。是好的风格编程吗?不。让我详细说明后者:

>

  • 应该有一个分离的关注点:谁负责内存管理?容器或类ite的用户,还是类ite本身?

    底线:不要提供函数suffice()。相反,将责任完全交给调用代码。使用标准库容器和智能指针来管理内存。

    编辑:关于你编辑中的问题。只管写

    items.erase( items.begin() + 1 );
    

    这将适用于所有类型:std::vector的值或指针。您可以在这里找到std::vector和C++标准库的良好文档。

  •  类似资料:
    • 我使用使用捕获的计数器从容器中删除一半元素,如下所示。用编译的C 20 输出出乎意料。对于向量,删除了一个额外的元素: 我打印出结果,看起来是意外删除的元素 虽然这通常不是erase_if的正常用法,但我仍然很好奇为什么它只发生在向量上,而不发生在其他贴图上。我猜这和迭代器类型shenanigan有关。如果有人能详细解释,我将不胜感激。

    • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

    • 下面的代码显示了我要做的:

    • 编辑问题,以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将帮助其他人回答这个问题。 我们知道:load with memory_order_acquire,store with memory_order_release但是,我发现用gcc4.8.2,open -O2时,抛出了一个编译错误,/usr/include/c/4 . 8 . 2/atomic:199:9:error:对于

    • 本文向大家介绍如果列表元素li的兄弟元素为div,会产生什么情况?相关面试题,主要包含被问及如果列表元素li的兄弟元素为div,会产生什么情况?时的应答技巧和注意事项,需要的朋友参考一下 单纯的对html来说主要是破坏了语义结构吧, css方面来说不好统一控制样式,div默认也没有list-style

    • 我在std::sort中发现了一个bug,特别是在一些QuickSort的实现中,我不知道问题是否出在一般的算法中。 精华: 当元素小于16时,所有的规范都被替换,因为std::sort使用插入排序。 当有17个或更多的元素时,使用快速排序,并从元素数量的对数限制递归深度,但向量在第一次__introsort_loop迭代时有时间恶化。 当有许多相同的元素时,就会出现向量损坏。用无效迭代器替换有效