2016-12-14 120 views
0
#include <iostream> 
#include <memory> 

using namespace std; 

void func() 
{ 
    cout << "func\n"; 
    int localVariable = 10; 
    int* p = new int; 
    shared_ptr<int> ptr (&localVariable); 
    shared_ptr<int> ptr1 (new int); 
    shared_ptr<int> ptr2 (p); 
} 

int main() 
{ 
    func(); 
    return 0; 
} 

我試圖堆上分配存儲器傳遞直接shared_ptr和還試圖被分配之前一些指針,編譯和成功運行。 但是當我試圖通過局部變量的地址shared_ptr,它開車撞下面的堆棧:程序崩潰上在C通過局部變量地址來共享指針++

vidhu @〜/文檔/ CPP_Practice $ ./a.out FUNC *錯誤的`./a.out 「:免費():無效的指針:0xbfc7f13c *

中止(核心轉儲)

這是爲什麼發生?我認爲刪除NULL指針是安全的,但它不是很好的編碼習慣。

+2

當'ptr'超出範圍,它的析構基本上不'刪除&所以LocalVariable;',其表現出不確定的行爲如'&localVariable'不是由'new'獲得的指針。我不確定你在說什麼'NULL'指針。 –

+0

@IgorTandetnik也嘗試過: int * q =&localVariable; shared_ptr ptr3(q); 現在我得到了雙倍免費或腐敗(出)錯誤。這個指針也沒有被新的獲得。那麼爲什麼我在這裏得到雙倍免費錯誤。 –

+0

我不知道我明白你在問什麼。未定義的行爲是未定義的。如果這樣做會傷害你,那麼不要這樣做。這個調查的具體內容是什麼?是否存在您正在嘗試解決的實際問題? –

回答

2

ptr超出範圍時,shared_ptr將嘗試刪除localVariable。但是,localVariable不是堆分配(通過new),所以它不能被刪除(並且它的內存是由堆棧自動管理的)。