簡體   English   中英

std :: unique_ptr數組和普通指針之間的區別

[英]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 ,因為沒有[]定義的操作符。

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

std :: unique_ptr

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM