2010-05-17 135 views
13
char *pointer1; 
char *pointer2; 

pointer1 = new char[256]; 
pointer2 = pointer1; 

delete [] pointer1; 

換句話說,我還必須做delete [] pointer2嗎?這是內存泄漏嗎?

謝謝!

+27

作爲一個經驗法則,delete的應該是通常匹配'new'的#號。 – Amber 2010-05-17 21:19:30

+0

你不刪除指針,你刪除它們指向的東西。 – immibis 2016-01-30 13:17:13

回答

17

不,這段代碼很好,不會泄漏內存。

您只需要使用delete []一次,因爲您只使用了一個新的內存來爲內存分配一個區域,即使有兩個指向同一內存的指針。

+12

正確。實際上,你**不能** - 試圖兩次刪除同一個內存塊會導致未定義的行爲。 – 2010-05-17 21:20:33

+4

還應該注意的是,任何試圖推行'pointer2'的嘗試都會導致未定義的行爲。 – 2010-05-17 21:23:48

+0

side ..當你在學習..我會說這是一個好主意,設置pointer1 = NULL;作爲刪除的反射。我已經看到了一堆代碼,其中指針被刪除,但後來該應用程序做了一個if(pointer1).. – baash05 2010-05-17 22:48:33

0

只能使用時所使用的新

刪除

良好實踐的研究是指針1設置爲NULL,但你不會有內存泄漏,如果你不

1

delete刪除,這是記憶由new分配。由於您只有一個new,您只需要一個delete

7

一個簡單的規則:您需要儘可能多的delete s,因爲有new s。更好的是,使用像智能指針或容器這樣的東西來爲你照顧它。

而另一個小點:pointer2一旦您撥打deletepointer1,就會變成「搖晃的指針」。

+2

請注意,指針1也成爲刪除後的懸掛指針... – 2010-05-17 21:33:56

+0

非常真實,但我認爲這是更明顯:) – 2010-05-17 23:43:11

0

不,您不必刪除[]指針2,因爲您還沒有爲它分配內存!

該語句pointer2 = pointer1使得pointer2指向與pointer1相同的內存地址,不會爲其分配任何額外的內存。

+0

Um ...'pointer2'指向與*'pointer1'相同的地址*不是指向'pointer1'的地址('pointer1'的地址是'&pointer1'。 – 2010-05-17 21:25:42

+0

@Nathan Ernst:對不起,我誤打錯了。更正 – nico 2010-05-17 21:29:46

0

每個new應該只有一個匹配delete。如果您刪除了另一個指針,則會違反該規則。

0

你在這裏做的只是告訴new char[256]分配的內存塊將在同一時刻由pointer1pointer2指向。

如果您之後寫入delete[] pointer2;語句,則會出現內存泄漏。

+2

如果他刪除了pointer2,這將是未定義的行爲,實際上,我沒有知道一個平臺會導致內存泄漏,很可能你會得到像segfault/AV這樣的東西。 – 2010-05-17 21:24:21

2

雖然它不會泄露內存,如果你想成爲明確的,你應該同時設置point1point2爲NULL(太初始化他們的方式。)

4

這不是一個泄漏,但它是問爲了麻煩。 pointer2指向誰知道什麼,只要您刪除pointer1。這就是所謂的「懸掛指針」。使用它可以在最好的情況下導致段錯誤,並且在最壞的情況下會導致神祕的數據在最終分配相同位置的任何事情中發生混亂。

0

以下是您思考的空白:您不要刪除指針 - 刪除內存。您只需使用一個指針來標識要釋放的內存塊。由於兩個變量指向相同的內存,因此刪除一個變量恰恰等同於刪除另一個變量。換句話說,刪除兩者與刪除其中一個兩次相同 - 這顯然是錯誤的。

2

另外,考慮使用來自Boost庫的boost::shared_ptr<>。這是自切片面包以來最偉大的事情。當最後一個指向它的指針超出範圍

typedef boost::shared_ptr<TypeX> StrRef; 

foo() { 
    StrRef pointer1(new TypeX); 

    while(something) { 
    StrRef pointer2 = pointer1; 
    // do stuff 
    } 

return; 
} 

數據(TypeX)將被刪除。你可以用內置的auto_ptr<>型類似的東西,如果你不需要引用計數:

typedef auto_ptr<TypeX> StrRef; 

foo() { 
    StrRef pointer1(new TypeX); 

    while(something) { 
    TypeX * pointer2 = pointer1.get(); 
    subroutine(pointer2); 
    if (condition) return; 
    } 

return; 
} 

每當pointer1超出範圍時,它會刪除數據。這樣做的好處是,您不必記得在底部的return語句之前放置一個刪除,並且如果pointer1由於任何其他原因超出了範圍(即從循環中間返回,或者subroutine()引發異常,則數據將仍然被正確釋放。

我沒有測試此代碼,所以你必須檢查文檔的auto_ptr<>boost::shared_ptr<>自己。

我強烈建議使用Boost庫一樣多儘可能它是由pro編寫的,它基本上是一個用於擴展C++的臨時區域。