在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
?在大多数情况下这是真的,在哪种情况下,如果不是这样的话?
答案 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
?