web-dev-qa-db-ja.com

make_unique値は文字配列を初期化しますか

例えば ​​-

_#include <memory>

int main(){
    const auto bufSize = 1024;
    auto buffer = std::make_unique<char[]>(bufSize);
}
_

ここのバッファーはすでに_'\0'_文字で埋められていますか、それともガベージ値を回避するために手動で埋める必要がありますか?.

そして、これを行うための可能な方法は何でしょうか、std::memset(&buffer.get(), 0, bufSize)で十分でしょうか?

20

すべてのmake_*関数は、コンストラクターパラメーターを指定しない場合、型の値の初期化を使用します。配列形式のmake_uniqueはパラメーターを取らないので、要素をゼロにします。

19
Nicol Bolas

はい、すべての要素は std :: make_unique によって 初期化された値 になります。

この関数は次のものと同等です。

unique_ptr<T>(new typename std::remove_extent<T>::type[size]())

そして

値の初期化

これは、変数が空のイニシャライザで構築されるときに実行される初期化です。

構文

new T (); (2)

そして

値の初期化の影響は次のとおりです。

3)Tが配列型の場合、配列の各要素は値で初期化されます。
4)それ以外の場合、オブジェクトはゼロで初期化されます。

次に、タイプcharの各要素について、値を'\0'に初期化(ゼロ初期化)します。

7
songyuanyao

cppreference によると、はい:

2)未知の境界Tの配列を作成します。このオーバーロードは、Tが未知の境界の配列である場合にのみ、オーバーロードの解決に参加します。この関数は次のものと同等です。

unique_ptr<T>(new typename std::remove_extent<T>::type[size]())
                                       value initialization ^

私が示した値の初期化。

5
eerorika