2013-05-09 44 views
0

我有一個這樣的簡單問題!在其他指針中刪除對象後指針是否爲NULL

class1 *a = new class1(); 
class1 *b = a; 

delete a; 
a= NULL; 

現在我想檢查b是否爲NULL(或刪除)也是,但b總是指向先前的點。 這是有問題的,當我想使用B,但一個已經刪除之前!

if (b){ 
    //do something here 
} 

感謝您的閱讀!

+5

http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-當我應該使用一個 – stardust 2013-05-09 18:34:51

回答

4

正如一些人所建議的那樣,使用共享指針會使這更容易。

如果你想這樣做的原始方式,這裏是當你說class1 *b=a你正在服用的指針值的副本爲什麼*b仍指向的a

原始值。所以不管你對a本身做什麼,b都會掛在這個原始值上。

如果你想將其與一起改變,你將需要分配一個參考a,或指向a指針

class1 **b = &a; 

所以,現在覺得當你提領b發生了什麼,是什麼價值是指向?

它會指向您的原始class1 *。所以,一旦你設置a=NULL,你現在有一個指針b指向的a值,或NULL

+0

我認爲這比共享指針更好,因爲它保留了原始代碼的流向。共享指針會改變對象的生命週期以與原始代碼不匹配。 – 2013-05-09 18:42:06

+0

這是真的,儘管它需要比共享指針需要更多的內存管理。 – 75inchpianist 2013-05-09 18:45:19

+0

是的,我認爲這種方法工作得很好,但它會使代碼看起來更多Pointer-Way,a已經是指針,現在b是指針^^的指針。從來沒有嘗試過,但我想我會嘗試在某些情況下使用它!謝謝! – greenpig83 2013-11-29 04:21:40

4

沒有辦法讓b自動更新a已經NULL d。問題代碼還說明了爲什麼在它的對象已被delete設置爲NULL的指針時,d最多隻能是部分指針,而非指針不能保證指針指向有效對象。

使用std::shared_ptr<class1>而是因爲有共同指向的所有權對象:

std::shared_ptr<class1> a = std::make_shared<class1>(); 
std::shared_ptr<class1> b = a; 

動態分配的對象將與兩個a遭到破壞和b走出去的範圍。

有關可用智能指針的概述,請參閱What C++ Smart Pointer Implementations are available?

+0

所以這是真的,我們必須在這種情況下使用智能指針!裸指針沒有其他解決方案! – greenpig83 2013-05-09 18:37:17

+0

@ greenpig83是的,這是事實。這可能是爲什麼創建智能指針。 – taocp 2013-05-09 18:39:01

+0

你根本不需要使用智能指針。見下面的解決方案有些情況下要求易用智能指針。 – 75inchpianist 2013-05-09 18:42:22