2012-01-21 46 views
1

以下的工作,總是?在C++中,如果我用一個釋放析構函數〜MyClass引用一個對象,那麼引用超出範圍調用析構函數?

class MyCLass { 
    int *pInt; 
public: 
    MyCLass() { 
     pInt = new int; 
     *pInt = 42; 
    } 
    ~MyCLass() { 
     delete pInt; 
     printf("Goodbye cruel world!"); 
    } 
    void func1() { 
     printf("Hello World %d", *pInt); 
    } 
}; 

MyCLass foo; 
{ 
    MyClass &bar = foo; 
    //Do stuff 
} 
foo.func1(); 

我擔心它的任務精確模擬原始對象bar將導致析構函數的調用,因爲它超出範圍。

+1

'MyCLass foo = new MyClass();'< - 除非MyCLass具有帶'MyClass'指針的構造函數,否則這是行不通的。 –

+0

語法錯誤,很好發現,謝謝cli_hit,原則保持不變。 – John

+0

構造函數的作用完全與問題無關。您可能會問,引用的生命週期結束是否導致裁判員的析構函數調用。當然,這是錯誤的。 – pmr

回答

3

不,它不會。在你的例子中,存儲與foo完全相關。當foo超出範圍時,析構函數將被調用。

當然,如果您仍然有該對象的引用,引用將引用一個現在不存在的對象,這可能會給你的問題。

引用不會模擬原始對象。它所做的只是說,當該對象存在時,通過引用的任何調用都將被重定向到該對象。

+0

我欣賞(你的快速反應和)你的建議,它不模仿對象,從C背景它看起來到底是什麼,它是爲什麼我堅持指針這麼久。 – John

+1

@John:引用和指針幾乎是一回事。如果您檢查彙編器,您會發現引用通常以與指針相同的方式實現。 – Goz

+0

引用是不可重複的,而指針是。它們是如何實現的並不重要,因爲如果沒有未定義的行爲,你將無法使用像指針這樣的引用。 – pmr

1

對象引用和(原始)指針不管理它的生命週期。因此,當超出範圍時,實物不會被破壞。否則,不能創建引用或指向堆棧分配的對象的指針,因爲它們會被多次銷燬(當引用/指針超出範圍並且對象本身超出範圍時)。在我看來,理解C++引用最簡單的方法就是將它們看作不能被重新分配的指針,並且每次訪問都會自動解除引用(基本上是語法糖來隱藏程序員的指針)。

作爲旁註,您的代碼是不正確的c + +。 MyCLass foo = new MyClass()聲明類型爲MyClass的(堆棧分配)對象,但嘗試將new MyClass()的結果分配給它,該結果是指向類型爲MyClass的堆分配對象的指針。初始化foo的正確方法是MyClass foo;

相關問題