【发布时间】:2022-01-10 08:58:04
【问题描述】:
例如,
class Test{
private:
int* foo;
public:
Test(int* foo){this->foo = foo;}
}
在这种情况下,有什么方法可以在析构函数中删除 foo 吗?我是否必须在析构函数中删除 foo 或至少将其设置为 nullptr?
【问题讨论】:
-
为什么要为成员和构造函数命名同名?
-
您不能就不是用
new创建的东西调用delete。就那么简单。如果Test()的调用者传入一个指向new'ed 对象的指针,则delete它。否则不要。这就是为什么使用原始指针如此模棱两可的原因。改为使用智能指针使所有权语义更加明确。 -
如果你的类构造函数的约定是它应该拥有指针的所有权,那么它需要负责删除指针。
-
@MatG 因为这是一种非常普遍的做法。它没有太多缺点,它可以更容易地确定这个参数的用途。
-
@MatG 如果函数体中未使用参数,则该做法相当有效(就可读性而言),这表明使用了成员初始化器列表,如
Test(int* foo) : foo(foo) {}。第一次看到它可能看起来很奇怪,但很容易习惯。
标签: c++ pointers memory-leaks ownership-semantics