2010-09-23 143 views
0

我有一個對象說。刪除兩個指針引用的對象指針

ClassA *obj1 = new ClassA; 

ClassA *ptr1 = obj1; 
ClassA *ptr2 = obj1; 

當我做delete ptr1;,是否會影響ptr2?如果是這樣的話,什麼纔是正確的解決方案?

+1

我假設'obj2'應該是'obj1'?無論如何,解決方案是[停止手動管理內存](http:// stackoverflow。COM /問題/ 3681455 /什麼,是最哲學 - 的 - 管理 - 存儲 - 在-C/3681471#3681471)。 – GManNickG 2010-09-23 04:23:45

回答

2

(假設obj2應該是obj1

ClassA *x限定指針可以指向ClassA類型的對象。指針不是一個對象本身。

new ClassA分配(和構造)ClassA類型的實際對象。

因此,行Class A *obj1 = new ClassA;定義了一個指針obj1,然後將其設置爲指向ClassA類型的新分配的對象。

Class A *ptr1 = obj1;定義一個指針ptr1,然後將其設置爲指向obj1指向同一件事,那就是,我們剛剛創建的ClassA對象。

Class A *ptr2 = obj1;後,我們有三個指針(obj1ptr1ptr2)都指向同一個對象。

如果我們做delete ptr1;(或等效地delete obj1;delete ptr2;),我們銷燬指向的對象。這樣做後,任何指向該對象的指針都會失效(這會回答您的第一個問題:是的,它會影響ptr2,因爲ptr2之後不會指向有效的對象)。

正確的解決方案取決於你想要達到的目的:

  • 如果你希望對象的兩個副本,假設ClassA有一個拷貝構造函數,做ClassA *ptr2 = new ClassA(*obj1);。當您完成這個任務後,您需要單獨使用delete這個新對象!
  • 如果你希望兩個指針指向同一個對象,可以考慮使用類似boost::shared_ptr(google一下)

嗯,這是很多文本的這樣一個簡單的Q +一個。呃,好吧。

+0

Thnx現在有很多瞭解這個概念。 – boom 2010-09-23 04:53:11

1

假設obj2應該是obj1那麼是的,在ptr1上的呼叫刪除將帶有無效數據的ptr2。解決方法是將ptr1設置爲NULL,如果您希望將其清空而不丟失指向ptr2中的對象。

刪除只是爲了當你想完全釋放內存。如果您仍然希望保留指向的對象和數據,但要清除指針,請將其設置爲NULL(或(void *) 0)。

+3

在C++中,'NULL'只是0(或等效),而不是指針類型。 – GManNickG 2010-09-23 04:44:03