gpt4 book ai didi

c++ - 如果 std::vector 元素 'commits suicide'(使用 delete this;)会发生什么?

转载 作者:太空狗 更新时间:2023-10-29 19:44:00 24 4
gpt4 key购买 nike

假设有一个 Item 的 vector

vector<Item*> items; //{item1, item2, item3}

然后,在代码的其他部分,

items[1]->suicide();

suicide 函数在哪里:

void Item::suicide()
{
delete this;
}

items vector 大小是多少,它现在是如何排列的?这样做可以吗?

编辑(我可以再问一个问题吗?):如果输出的期望排列是{item1, item3},大小是2,并且没有悬挂指针,如何以自毁方式(从 item2 本身)做到这一点?

编辑 2:感谢您的所有回答!惊人的。所以我最终决定并找到了从对象外部执行此操作的方法,因为这是一种不好的做法,而且不必要地复杂

最佳答案

什么是项目 vector 大小及其现在的排列方式?相同。函数调用根本不会改变 vector 的内容和大小。它只是释放指针指向的内存。

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

  • 应该分离关注点:谁负责内存管理?类的容器或用户 Item或类 Item本身?

  • 通常容器或用户应该这样做,因为他知道发生了什么。

  • 有什么方法可以做到这一点?现代和安全的 C++ 代码中的内存管理主要是使用像 std::shared_ptr 这样的智能指针来完成的。和 std::unique_ptr和像 std::vector 这样的容器和 std::map .

  • 如果类 Item是一个值类型(这意味着您可以简单地复制它并且它在虚函数方面没有多态行为),然后只需使用 std::vector<Item>而不是你的代码。一旦元素从容器中移除,析构函数将自动调用。容器会为你做这件事。

  • 如果类 Item具有多态行为,可以作为基类,那么使用std::vector<std::unique_ptr<Item>>std::vector<std::shrared_ptr<Item>>相反,更喜欢 std::unique_ptr解决方案,因为它增加了更少的开销。一旦你停止引用一个对象,它就会被你正在使用的智能指针的析构函数自动删除。您(几乎)不再需要担心内存泄漏。

  • 产生内存泄漏的唯一方法是您拥有包含 std::shared_ptrs 的对象。以循环方式相互引用。使用 std::unique_ptrs可以避免这种麻烦。另一个出路是 std::weak_ptrs .

底线:不要提供函数 suicide() .而是将责任完全交给调用代码。使用标准库容器和智能指针来管理您的内存。

编辑:关于您编辑中的问题。随便写

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

这适用于所有类型:std::vector的值或指针。您可以找到一份很好的文档 std::vector和 C++ 标准库 here .

关于c++ - 如果 std::vector 元素 'commits suicide'(使用 delete this;)会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com