我有一個對象說。刪除兩個指針引用的對象指針
ClassA *obj1 = new ClassA;
ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;
當我做delete ptr1;
,是否會影響ptr2
?如果是這樣的話,什麼纔是正確的解決方案?
我有一個對象說。刪除兩個指針引用的對象指針
ClassA *obj1 = new ClassA;
ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;
當我做delete ptr1;
,是否會影響ptr2
?如果是這樣的話,什麼纔是正確的解決方案?
(假設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;
後,我們有三個指針(obj1
,ptr1
,ptr2
)都指向同一個對象。
如果我們做delete ptr1;
(或等效地delete obj1;
或delete ptr2;
),我們銷燬指向的對象。這樣做後,任何指向該對象的指針都會失效(這會回答您的第一個問題:是的,它會影響ptr2
,因爲ptr2
之後不會指向有效的對象)。
正確的解決方案取決於你想要達到的目的:
ClassA
有一個拷貝構造函數,做ClassA *ptr2 = new ClassA(*obj1);
。當您完成這個任務後,您需要單獨使用delete
這個新對象!boost::shared_ptr
(google一下)嗯,這是很多文本的這樣一個簡單的Q +一個。呃,好吧。
Thnx現在有很多瞭解這個概念。 – boom 2010-09-23 04:53:11
假設obj2
應該是obj1
那麼是的,在ptr1
上的呼叫刪除將帶有無效數據的ptr2
。解決方法是將ptr1
設置爲NULL
,如果您希望將其清空而不丟失指向ptr2
中的對象。
刪除只是爲了當你想完全釋放內存。如果您仍然希望保留指向的對象和數據,但要清除指針,請將其設置爲NULL
(或(void *) 0
)。
在C++中,'NULL'只是0(或等效),而不是指針類型。 – GManNickG 2010-09-23 04:44:03
我假設'obj2'應該是'obj1'?無論如何,解決方案是[停止手動管理內存](http:// stackoverflow。COM /問題/ 3681455 /什麼,是最哲學 - 的 - 管理 - 存儲 - 在-C/3681471#3681471)。 – GManNickG 2010-09-23 04:23:45