2014-09-23 95 views
-1

有:差::的unique_ptr

std::unique_ptr< double> d(new double[3]); 

std::unique_ptr< double[]> darr(new double[3]); 

至少兩者之間的差異之一似乎是,在以後的調用delete[]但兩者都是有效的..但是怎麼回事?我的意思是在第一種情況下內存如何刪除,是不是用delete刪除數組的未定義行爲?

其次,我知道上面darr[]運營商定義,但如何訪問的d第二和第三個成員,因爲沒有定義[]運營商。

爲什麼會有人使用第一種語法而不是第二種?

+5

第一個是無效的。 – juanchopanza 2014-09-23 21:43:54

+0

哇我的問題來自閱讀博士多布斯文章http://www.drdobbs.com/cpp/c11-uniqueptr/240002708這是混亂比! – zar 2014-09-23 21:46:52

+1

我看過這篇文章,但找不到任何新的int [x]的使用,但是有新的int(x),它是初始化值。 – Surt 2014-09-23 22:38:01

回答

2

std::unique_ptr

template < 
    class T, 
    class Deleter 
> class unique_ptr<T[], Deleter>; 

管理對象的一個​​動態分配的陣列(例如,與新的[]分配)的壽命。

不幸的是,表達std::unique_ptr<double>(new double[3])沒有警告或錯誤編譯,結束了設置所述new[]分配與delete(標量版本),其導致在運行時未定義的行爲。

您可以使用std::vector<double>(3)來自動分配和處理陣列。

兩者之間的區別
0

至少有一個似乎是,在以後的調用刪除[],但兩者都是有效的..

第一個是無效的。內存必須分配爲new,而不是new[]。編譯它的唯一原因是因爲第一個語法預計輸入爲double*,並且double[]降級爲double*

我的意思是如何存儲在第一種情況下

刪除使用delete,不delete[]

是不是未定義的行爲刪除數組與​​刪除?

是。

其次,我知道darr上面有[]運算符定義,但如何訪問d的第2和第3個成員,因爲沒有定義[]運算符。

你必須使用其get()方法來訪問底層的指針,例如:

double value = d.get()[1] 

爲什麼會有人使用第一個語法,而不是第二個?

沒人應該是數組的第一個語法。第二種語法是專門爲陣列添加的。