2014-10-22 33 views
4

這會導致我的程序有一個斷言失敗:獨特PTR初始化斷言失敗

int a = 5; 
std::unique_ptr<int>intptr(&a); 

錯誤

文件:F:\ DD \ vctools \ CRT \ crtw32 \雜項\ dbgdel。 CPP

線:32

表達式:_BLOCK_TYPE_IS_VALID(PHEAD> nBlockUse)

當我用「new」或「= make_unique(..)」初始化它時,它很好用,但我很想知道爲什麼我不能通過給現有變量的地址來初始化它。

+6

您無法從堆棧分配或取消分配內存。由於在堆棧中聲明瞭'a',所以不能將其刪除,這是'unique_ptr'在超出範圍時嘗試執行的操作。 – CoryKramer 2014-10-22 12:02:05

+0

出於興趣,你想在這裏做什麼? – doctorlove 2014-10-22 12:30:14

+0

doctorlove - >沒什麼,我只是爲了學習目的而想學習的東西 – user2591935 2014-10-22 13:46:07

回答

2

變量a位於堆棧上,如果將它綁定到unique_ptr,當unique_ptr超出範圍時,它將調用delete上的一個無法刪除的變量。

基本上,你不能獲得一個自動存儲變量的所有權,只有一個動態存儲變量。

2

您可以初始化。錯誤是銷燬unique_ptr,因爲默認情況下它是delete所有者指針。您應該使用new創建,或者使用客戶刪除程序。

1

只有當你有一些奇怪自定義刪除,沒有爲實際銷燬做任何事情,你可以使用地址。

struct D{ 

    void operator()(int* p) const { 
     std::cout << "Deleter \n"; 
     //... no actual delete 
    } 
}; 

int a =5;  
std::unique_ptr<int,D> intptr (&a); 
2

可以通過使用定製刪除這樣的初始化unique_ptr到自動變量:

auto noop = [](int*){}; 
std::unique_ptr<int, decltype(noop)>intptr(&a, noop); 

只要記住不要讓指針逃脫範圍在自動變量的生命。

但是,在這裏使用unique_ptr可能沒有任何意義,因此您可能需要重新考慮您的方法。