2012-03-31 196 views
1

在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

這是一個析構函數。所以,在調用析構函數時回答這個問題,即類。如果您使用智能指針,則不必擔心。 – chris 2012-03-31 03:17:58

+1

這將是您的設計選擇。唯一強制執行的規則是:你的程序必須爲每個'new'調用'delete'。 – 2012-03-31 03:19:00

回答

3

這是一個基本的所有權問題。如果每個A都應該擁有一個B(如,在創建A時應該有一個新的B創建,也應該銷燬該A被銷燬,那麼你通常會讓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應該只是這樣寫:

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

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

這樣,B實例將被創建並自動銷燬,根本沒有任何干預。

+0

不要忘記三條法則。 – chris 2012-03-31 03:22:33

+0

@chris:是 - 只是做正確的一部分原因,並直接在A中聚合B的實例並完成它。 – 2012-03-31 03:23:50

+0

我還應該指出,如果需要,可以轉讓所有權。在這一天結束時,作爲一名程序員,由您決定誰擁有什麼,是否擁有所有權,或者所有權是否根據應用程序狀態進行轉移。 – 2012-03-31 09:34:33

1

幾乎總是A應該管理它的成員,因爲這是RAII是基於關閉的。儘可能使用unique_ptr

如果不對其進行管理的數據,那麼就應該使用不同的智能指針,特別是shared_ptr。這將責任轉移到shared_ptr,這比一個香草指針更容易出錯。

和當然,首選的方法是在根本不使用指針。你爲什麼首先打電話給new

+1

我爲什麼要撥打新電話:要問這個問題。我來自Java和C的C++,我想了解一切。我從來沒有聽說過智能指針或RAII,但我會查找它們。謝謝! – Robz 2012-03-31 03:31:07

+0

@Robz - 在C++中你很少調用'new'。 C++和Java是*非常不同的語言。 – 2012-03-31 06:49:36

+0

@BoPersson,你用C++編寫的程序你幾乎不會稱之爲新的? :) – 2012-03-31 09:35:23