2013-08-17 131 views
0

我已經閱讀了一些關於智能指針的指南,並且我認爲我理解它的竅門(沒有雙關語意思),但有些東西仍然困擾着我。智能指針和堆棧對象

智能指針用於指向堆中使用new分配的數據,一旦智能指針超出範圍,析構函數就會釋放指針指向的信息。但是,假設我犯了一個錯誤,並且使智能指針指向堆棧上而不是堆上分配的對象。在這種情況下,我會得到一個令人討厭的分段錯誤錯誤,因爲我會嘗試在堆棧對象上使用刪除。

爲了說明這個問題,下面是兩個代碼片段。對於這個演示,我使用智能指針的this實現。首先,正確的方式來使用智能指針

int main(void) 
{ 
    int my_num = 17; 
    int *p = new int(my_num); 
    MyAuto_Ptr<int> p2(p); 

    return 0; 
} 

和這裏的車版本,一個指向堆棧對象,這將導致分段錯誤。

int main(void) 
{ 
    int my_num = 17; 
    int *p = &my_num; 
    MyAuto_Ptr<int> p2(p); 

    return 0; 
} 

如果智能指針指向堆棧對象,有什麼方法可以提醒用戶嗎?

+0

替換「,這導致分段錯誤「與」調用未定義的行爲「。就像'刪除p'一樣。 – Elazar

回答

3

首先,用正確的方法使用智能指針

不,這不是使用智能指針的正確方法。

使用智能指針的整個想法是,你從來沒有首先創建一個「原始」指針。所以,你正確的方法應該是這樣的:

MyAuto_ptr<int> p(new int(my_num)); 

有沒有什麼辦法來提醒,如果一個智能指針指向用戶棧對象?

有沒有通用的方法來做到這一點,但系統特定的運行時檢查可能是可能的。

然而,當你避開「原始」的指針,試圖初始化一個堆棧對象智能指針會立即伸出:不加思考,你可以告訴這是錯誤的:

MyAuto_ptr<int> p(&my_num);