2012-02-29 199 views
2

我的意思是,如果我有一些類,如:如何刪除具有指針成員的類的指針?

class A{ 
    int* pi; 
}; 
*A pa; 

當我打電話delete pa,將pi被刪除?

+0

這將是,如果你編寫代碼的時候是。它不會是如果你編碼它不是。決定你想要的和編碼的。 – 2012-02-29 11:43:12

+0

避免使用標準庫容器或智能指針作爲成員。 – stefaanv 2012-02-29 11:59:47

+0

不可以。但請注意,它會調用析構函數,您可以在其中清理A實例。如果你想在那裏刪除pi,那麼你可以做到這一點。 **但是**你必須確保你正確地擁有指針。循環[rule of three](http://stackoverflow.com/questions/4172722)。 – 2012-02-29 15:36:09

回答

8

您需要定義一個析構函數delete pi;。此外,你還需要定義,否則當A一個實例被複制兩個對象將指向同一int拷貝構造函數和賦值運算符,當A實例之一是破壞留下的A其他實例將被刪除與一個搖晃的指針。

例如:

class A 
{ 
public: 
    // Constructor. 
    A(int a_value) : pi(new int(a_value)) {} 

    // Destructor. 
    ~A() { delete pi; } 

    // Copy constructor. 
    A(const A& a_in): pi(new int(*a_in.pi)) {} 

    // Assignment operator. 
    A& operator=(const A& a_in) 
    { 
     if (this != &a_in) 
     { 
      *pi = *a_in.pi; 
     } 
     return *this; 
    } 
private: 
    int* pi; 
}; 
+0

哎呀。 : - )----- :-( – 2012-02-29 15:38:02

1

你應該實施一個析構函數~A(),它負責清理A的東西。隨後,在類型A將清理一切的指針調用delete

+1

但是,永遠記住,如果你需要一個析構函數,你幾乎肯定需要一個拷貝構造函數和拷貝賦值運算符太,每[三規則(http://stackoverflow.com/questions/4172722) – 2012-02-29 11:45:13

0

你需要寫一個析構函數刪除所有指針類型的成員。例如:

class A 
{ 
    int *pi; 
    public: 
    ~A(){delete pi;} 
}; 

您將需要確保您的構造函數爲pi分配一個值(至少爲NULL)。並且像@hmjd的答案一樣,您將需要實現或隱藏複製構造函數和賦值運算符。看三個這裏的規則: http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29