2017-06-07 21 views
-3

「刪除」命令,我是一個新的C++的學習者。我有一個簡單的問題。這是一本書的代碼。是否有必要創建一個新的指針「pCat」?我可以只使用「rCat」並刪除它嗎?如果不是,爲什麼?關於C++

class SimpleCat 
{ 
public: 
    SimpleCat (int age, int weight); 

    ~SimpleCat() {} 

    int GetAge() { return itsAge; } 
    int GetWeight() { return itsWeight; } 

private: 
    int itsAge; 
    int itsWeight; 
}; 

SimpleCat::SimpleCat(int age, int weight): 
    itsAge(age), itsWeight(weight) {} 

SimpleCat* TheFunction(); 

int main() 
{ 
    SimpleCat* rCat = TheFunction(); 

    int age = rCat->GetAge(); 

    std::cout << "rCat is " << age << " years old!\n"; 

    std::cout << "rCat: " << rCat << "\n"; 
    // How do you get rid of that memory? 
    SimpleCat* pCat = rCat; 
    delete pCat; 
    return 0; 
} 

SimpleCat* TheFunction() 
{ 
    SimpleCat *pFrisky = new SimpleCat(5,9);`` 
    std::cout << "pFrisky: " << pFrisky << "\n"; 
    return pFrisky; 
} 
+0

是你可以做'刪除rCat'。你爲什麼認爲你無法做到這一點? –

+4

如果這是來自書籍的代碼,建議將其扔掉。 –

+0

@ manni66:的確,書和代碼都是。 – Bathsheba

回答

3

鑑於TheFunction這一定義,是的,你最終應該delete返回值。請注意,您可以直接使用delete rCat; - 您不需要將其複製到另一個指針pCat中,然後將其刪除。

但是,它會更好,如果TheFunction返回std::unique_ptr<SimpleCat>代替原始SimpleCat*指針。

首先,這清楚地表明,返回的值是什麼,必須進行清理,而不是例如指向一些實際存儲在別處。

其次,由於unique_ptr對象會爲你做,所以根本不需要實際使用delete

+3

使用'std :: unique_ptr'的好建議:有點贊成。 – Bathsheba

+0

很好的答案。謝謝。現在我學習一個新的命令,std :: unique_ptr – Yue

+0

@Yue你應該[挑選一本新書](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)如果它建議你在沒有給你足夠的背景知識的情況下做所有這些東西。 'delete'是一個運算符,'std :: unique_ptr'是一個模板類,C++中沒有什麼叫做命令 –

0

規則很簡單,你需要調用delete上一直使用new分配的任何指針。 (並且您只需撥打delete一次。)

沒有必要將指針指定給另一個變量,並且請撥打delete

因此,因此,你可以更加最小:

delete TheFunction();

將工作太,雖然,當然,你不能就能夠做多少貓。

+0

謝謝。我學會了。 – Yue

+0

或者最簡單 - 刪除新的SimpleCat(5,9);'。 – DeiDei

+0

@DeiDei:可愛。 – Bathsheba