gpt4 book ai didi

C++ 指针数据成员 : Who should delete them?

转载 作者:太空狗 更新时间:2023-10-29 23:42:37 24 4
gpt4 key购买 nike

假设我有这样一个类:

class A {
public:
A( SomeHugeClass* huge_object)
: m_huge_object(huge_object) {}
private:
SomeHugeClass* m_huge_object;
};

如果有人这样使用构造函数:

A* foo = new A(new SomeHugeClass());

谁负责对构造函数中新建的对象调用 delete?在这种情况下,调用 A 构造函数的范围只能删除 foo,因为 SomeHugeClass 是匿名的。

但是,如果有人这样使用构造函数怎么办?

SomeHugeClass* hugeObj = new SomeHugeClass();
A* foo = new A(hugeObj);

然后,调用者可以在某个时候调用 delete hugeObj,对吗?

这个 A 的实现会在销毁时泄漏内存吗?

我正在做一个项目,其中有很多对象组合是通过这种方式完成的,尽管我很想使用智能指针,但在我开始之前,我必须与项目负责人讨论更改旧代码以利用它可以。

最佳答案

只要有可能,我都会尽量遵循这个简单的规则:调用 new 的人也应该调用 delete。否则代码很快就会变得太乱,无法跟踪删除的内容和未删除的内容。

在你的例子中,如果 A::A 接收到指针,它不能删除它。想想这个简单的例子:

SomeHugeClass* hugeObj = new SomeHugeClass();
A * a1 = new A(hugeObj);
A * a2 = new A(hugeObj);

A 类无法知道还有谁在使用该指针!

如果您希望类 A 处理指针,它应该自己创建它。

当然,您可以处理这两种情况,但这可能有点矫枉过正,像这样:

A::A() : own_huge_object(true) {
m_huge_object = new SomeHugeClass();
}
A::A(SomeHugeClass * huge_object ) : own_huge_object(false) {
m_huge_object = huge_object;
}
A::~A() { if(own_huge_object) delete m_huge_object; }

关于C++ 指针数据成员 : Who should delete them?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3264803/

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