2015-11-11 24 views
1

我有以下代碼。我不明白爲什麼在B.GetNum()中調用第一個條件。我怎樣才能確保何時刪除主要是我的B類不嘗試使用已刪除的變量?C++ nullptr檢測

class A 
{ 
public: 
    A(int num) : m_num(num) {} 
    int GetNum() { return m_num; } 

private: 
    int m_num; 
}; 

class B 
{ 
public: 
    B(A* a_) : a(a_) {} 
    int GetNum() 
    { 
     if (a != nullptr) 
     { 
      return a->GetNum(); // Why does this branch get called? 
     } 
     else 
     { 
      return -1; 
     } 
    } 

private: 
    A* a; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    A* a = new A(5); 
    B b = B(a); 
    delete a; 
    a = nullptr; 

    int result = b.GetNum(); 

    return 0; 
} 

回答

1

你有兩個不同的a。語句a = nullptr;隻影響main內的指針。 b中的指針是副本幷包含舊值(現在無效)。

GetNum()中使用它會導致未定義的行爲,並且任何東西都可能發生。

1

因爲您將A*值複製到您的類中 - 它永遠不會更改,但是當您刪除原始分配的值時,指針指向垃圾位置。

6

您遇到的問題是您在main()中創建b時複製指針。當您在main()中更改a時,它對存儲在b中的指針沒有影響。

這是一個完美的使用案例std::weak_ptr。您可以讓Bweak_ptr,然後在GetNum中檢查指針是否仍然存在。