[英]difference between array and plain pointer with std::unique_ptr
有:
std::unique_ptr< double> d( new double[3] );
和
std::unique_ptr< double[]> darr( new double[3] );
兩者之間至少有一個區別,似乎是以后的調用delete[]
但都有效。 我的意思是在第一種情況下如何刪除內存,這不是帶有delete
未定義行為刪除數組嗎?
其次我知道darr
上面已[]
操作者定義,但如何訪問的第二和第三構件d
,因為沒有[]
定義的操作符。
為什么有人會使用第一種語法而不是第二種語法?
template <
class T,
class Deleter
> class unique_ptr<T[], Deleter>;
管理動態分配的對象數組的生存期(例如,使用new []分配)。
不幸的是,表達式std::unique_ptr<double>(new double[3])
編譯時沒有警告或錯誤,最終將new[]
分配處理為delete
(標量版本),這在運行時導致未定義的行為。
您可以使用std::vector<double>(3)
使數組自動分配和處置。
兩者之間至少有一個區別,似乎是以后的調用delete []都有效。
第一個無效。 內存必須分配為new
,而不是new[]
。 它完全編譯的唯一原因是因為第一種語法期望double*
作為輸入,而double[]
降級為double*
。
我的意思是在第一種情況下如何刪除內存
使用delete
而不是delete[]
。
這不是具有刪除行為的未定義行為嗎?
是。
其次,我知道上面的darr定義了[]運算符,但是由於沒有定義[]運算符,因此如何訪問d的2和3rd成員。
您必須使用其get()
方法訪問基礎指針,例如:
double value = d.get()[1]
為什么有人會使用第一種語法而不是第二種語法?
沒有人應該成為數組的第一個語法。 第二種語法是專門為數組添加的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.