2015-10-04 226 views
0

有人可以在這裏解釋崩潰嗎?unique_ptr當調用reset時數組崩潰

#include <iostream> 
#include <memory> 

int main() { 
    int *num1 = new int(5), *num2 = new int(18); 
    std::unique_ptr<int> numptr = std::unique_ptr<int>(num1); 
    std::cout << *numptr.get() << '\n'; // 5 
    numptr.reset(num2); 
    std::cout << *numptr.get() << '\n'; // 18 

    int a[5] = {0,2,4,6,8}, b[5] = {0,3,6,9,12}; 
    std::unique_ptr<int[]> u = std::unique_ptr<int[]>(a); 
    std::cout << u[3] << '\n'; // 6 
    u.reset(b); 
    std::cout << u[3] << '\n'; // Crash. Why??? Should output 9, right? 
} 

沒有崩潰調用具有std::unique_ptr<int>復位時,爲什麼與std::unique_ptr<int[]>崩潰。如我所見,u取得b的所有權,然後刪除a。所以u[3]應該是b[3] = 9應該工作正常,因爲b不會被刪除。這裏發生了什麼?

+1

'unique_ptr'只能管理動態分配的對象。 「a」和「b」都不是其中之一。 – juanchopanza

+0

那麼上面的「u」是做什麼的? – prestokeys

+1

'std :: unique_ptr'假定它保存的啞指針在'new'或'new []'的堆上被分配。在其析構函數或reset()中,它試圖「刪除」或「刪除[]」指針。您反而將它提供給堆棧上自動對象的地址。 –

回答

2

你將unique_ptr包裝在一個數組中,該數組具有自動存儲持續時間,並且它的內存將由運行時釋放。在程序結束時,unique_ptr嘗試釋放相同的內存。基本上線u.reset(b);相當於delete[] a; // then set u to point to b

如果你嘗試一個簡單的程序像

int main() 
{ 
    int arr[10]; 
    delete[] arr; // runtime error here 
} 

你會得到完全相同的錯誤。你不應該使用智能指針和非動態對象。

相關問題