删除是谁的责任

时间:2012-03-31 03:13:18

标签: c++ memory-management

在C ++中,它的职责是删除类的成员:类或该类实例的创建者?
例如,在以下代码中:

class B {
  public:
    B(int x) { num = x; }
    int num;
};

class A {
  public:
    A(B* o) { obj = o; }
    B* obj;
};

int main(void) {
  A myA(new B(3));
  return 0;
}

main应该删除B的实例,还是应该A的析构函数删除其局部变量obj?在大多数情况下这是真的,在哪种情况下,如果不是这样的话?

2 个答案:

答案 0 :(得分:3)

这是所有权的基本问题。如果每个A都应拥有B(例如,在创建B时应该创建一个新的A,那么该A也应该被销毁{{1}被销毁,然后你通常会让A负责创建和销毁B的实例:

class B { 
    int num;
public:
    B(int x) : num(x) {}
};

class A { 
    B *obj;
public:
    A(int value) : obj(new B(value)) {}
    ~A() { delete B; }
};

然而,在这种情况下,A应该写成:{/ p>

class A {
    B obj;
public:
    A(int v) : obj(v) {}
};

int main() { 
    A a(3);
    return 0;
}

这样,B的实例将自动创建和销毁,完全没有任何干预。

答案 1 :(得分:1)

几乎总是A应该管理它的成员,因为这是RAII的基础。尽可能使用unique_ptr

如果它不管理它的数据,那么它应该使用不同的智能指针,特别是shared_ptr。这会将责任转移到shared_ptr,这比香草指针更容易出错。

当然,首选的方法是根本不使用指针。你为什么要首先打电话给new