gpt4 book ai didi

c++ - 使用析构函数删除成员 vector 中的堆分配对象

转载 作者:行者123 更新时间:2023-11-30 05:13:44 28 4
gpt4 key购买 nike

我有一个要解决的递归问题。如果给定的操作是可能的,则可能存在其他子操作,等等。我的解决方案是这样的类:

// MyObj.h
#include <vector>
class MyObj
{
private:
std::vector<MyObj*> _children;
public:
void addChild(MyObj* m);
}

// MyObj.cpp
#include "MyObj.h"
void MyObj::addChild(MyObj* m)
{
MyObj::_children.push_back(m);
}

我正在使用这样的类:

MyObj m;
MyObj *child = new MyObj();
m.addChild(child);

我的理解是,由于我在堆上分配了child,所以我需要稍后销毁它。如果创建该对象的代码不维护该引用,则将由父对象来销毁它。像这样定义析构函数是否合适:

MyObj::~MyObj()
{
for (std::size_t i = 0; i < MyObj::_children.size(); i++)
{
delete MyObj::_children[i];
}
}

我的做法是否正确,还是我的方法有缺陷?

PS:如果这是直接重复,我深表歉意,因为我知道已经有很多关于析构函数的问题;我读了很多书,但仍然没有信心。我对 C++ 非常缺乏经验,我认为直接提问对我最有帮助。

最佳答案

你不应该使用 new除非绝对必要。一旦你这样做了,你就有责任释放你动态分配的内存。在您上面的代码中:

MyObj m;
MyObj *child = new MyObj();
m.addChild(child);

一旦函数超出范围,mchild将调用它们的析构函数,因为它们不是动态分配的,因此会同时销毁它们。

但是,child指向的内容指针不会以与m 类似的方式销毁和 child因为它是通过 new 在免费商店中动态分配的.在这种情况下,您需要调用 delete对于您放置在免费商店中的每个对象,就像您在上面所做的那样。

这就是为什么人们在评论中建议您使用智能指针,因为他们遵循 RAII范例,在这种情况下,一旦对象超出范围,它们将自动被释放。

关于c++ - 使用析构函数删除成员 vector 中的堆分配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43790707/

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