「std::make unique」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「std::make_unique とは、C++14で追加された std::unique_ptrクラスのオブジェクトを生成するヘルパー関数です。ヘルパー関数を...」)
 
(相違点なし)

2014年11月9日 (日) 16:53時点における最新版

std::make_unique とは、C++14で追加された std::unique_ptrクラスのオブジェクトを生成するヘルパー関数です。ヘルパー関数を使用することでnewの呼び出しは、不要となります。

読み方

std::make_unique
えすてぃーでぃー めいく ゆにーく

概要

C++14以前ではstd::unique_ptrとnewを利用する場合、以下のコードを書きました。

std::unique_ptr<C> c(new C());

C++14でstd::make_uniqueを使用する場合、newは不要になります。

auto v1 = std::make_unique<C>();

例外

エラーがある場合は、コンストラクタによって例外が送出されます。

初期化について

初期値を与えない場合は、以下の通りです。

auto v1 = std::make_unique<C>();

初期値を与える場合は、以下の通りです。

auto v2 = std::make_unique<C>(1,2,3);

配列を宣言する場合には、以下の通りです。size は、配列の数を指定します。

std::unique_ptr<C[]> v3 = std::make_unique<C[]>(size);

ヘッダファイル

#include <memory>

std_make_unique1.cpp の例

ソースコード std_make_unique1.cpp

/*
 * std_make_unique1.cpp
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
 
#include <iostream>
#include <memory>
 
struct C {
        int x, y, z;
        C() : x(0), y(0), z(0) { }
        C(int x, int y, int z) : x(x), y(y), z(z) { }
 
        friend std::ostream& operator<<(std::ostream& os, C& c) {
                return os << "{" << "x:" << c.x << ", y:" << c.y << ", z:" << c.z << "}";
        }
};
 
int main(int argc, char const* argv[])
{
        int size = 5;
        auto v1 = std::make_unique<C>();
        auto v2 = std::make_unique<C>(1,2,3);
        std::unique_ptr<C[]> v3 = std::make_unique<C[]>(size);
 
        std::cout << *v1 << std::endl;
        std::cout << *v2 << std::endl;
        std::cout << "v3" << std::endl;
        for (int i = 0; i < size; i++) {
                        std::cout << "\t" << v3[i] << std::endl;
        }
        return 0;
}

コンパイル

g++49 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49 -std=c++14  std_make_unique1.cpp -o std_make_unique1

実行例

% ./std_make_unique1
{x:0, y:0, z:0}
{x:1, y:2, z:3}
v3
        {x:0, y:0, z:0}
        {x:0, y:0, z:0}
        {x:0, y:0, z:0}
        {x:0, y:0, z:0}
        {x:0, y:0, z:0}

関連項目