gpt4 book ai didi

c++ - 关于在继承层次结构中删除资源的最佳实践

转载 作者:可可西里 更新时间:2023-11-01 17:08:20 25 4
gpt4 key购买 nike

考虑以下代码:

class Base {
protected:
int* ptr_;

public:
virtual ~Base() { /* delete ptr_ ?? */ }
}

class A : public Base {
public:
A() { ptr_ = new int; }
~A() { /* delete ptr_ ?? */ }
}

我和同事有点小争执。
哪个析构函数应该删除 ptr_
我认为它应该在 A 中,因为它是它被分配的地方。
他认为它应该在 Base 中,因为那是指针所在的位置。

请给出可能的陷阱,为什么一种方法比另一种更好(如果有的话,这不仅仅是品味问题)

编辑
很多人质疑设计。实际上,代码要复杂得多,并且模拟了一个涉及几个摄像头的图像处理系统。Base 的作用是管理系统的资源(存在一些配置)。类 A 和其他类似的派生类型决定 Base 的配置并将系统初始化为特定配置。我想现在你可以问继承是否是组合的正确选择。 A 是一个Base,只是一个特定的种类,这就是我们选择继承的原因。在这种情况下,ptr_ 是一个指向相机特定驱动程序的指针,这将由派生类型决定,这就是它被分配在那里的原因。

最佳答案

每个类都应该管理自己的资源。当您有多个派生类时,每个派生类都必须记住释放指针。这很糟糕,因为它重复了代码。

如果允许某些派生类不为指针分配新值,则在基类构造函数中将其设置为零。如果应允许某些派生类将自动变量的地址分配给指针,请检查您的设计。

使用智能指针使问题完全消失(当我在我的整个代码库中grep delete * 时,我找不到匹配项:)

关于c++ - 关于在继承层次结构中删除资源的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7240041/

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