C++11のスマートポインタが使える場合に、new, deleteは必要なのか


C++11には`weak`, `shared`, `unique`のスマートポインタがありますが、これらが使える環境であえてnew,
deleteだけを使ったインスタンスの生成を使う意味はありますか?

C++11ではnew, deleteだけを使った方法は、使うべきではない方法という位置付けなのでしょうか?

後方互換性は考えないものとします




らっしーさんの回答は更新されて`new`と`unique`とで大差ない値が出てしまっているので、[更新前](https://ja.stackoverflow.com/revisions/33689/1)、何が起こっていたのかを説明しておきます。

当たり前と感じるかもしれませんが、

[code]

    int i0;
    
[/code]

と記述した場合、C言語互換で未初期化の変数`i0`が用意されます。これを

[code]

    int i1 = int();
    int i2{};
    
[/code]

などの記述をするとデフォルトコンストラクターが実行され`0`で初期化されます。同様のことが`new`でも存在し

[code]

    int* j0 = new int;
    int* j1 = new int();
    int* j2 = new int{};
    
[/code]

`j0`はメモリ確保は行われますが未初期化のままであり、`j1`および`j2`はメモリ確保の後にデフォルトコンストラクターによって`0`で初期化されます。  
そして本題、

[code]

    std::unique_ptr<int> k = std::make_unique<int>();
    
[/code]

ですとどうしてもデフォルトコンストラクターを呼び出してしまうため強制的に初期化のコストがかかります。

また`unique_ptr`は動的に`release()`可能です。そのため、`unique_ptr`デストラクターでは保持しているポインターが解放済みであるかどうかのテストが追加されます。対してハードコードされた`delete
var;`文ではこのテストが省略されている点も実行時間の差分に含まれています。

まとめると **実行時の初期化コストの差**
でしょうか。この程度の差を気にしないのであれば、`delete`し忘れを防ぐ意味でも`unique`や`shared`を使うべきでしょう。また実行時間に対して初期化が支配的となるような場合、`new`と`unique`の差を気にするよりも構造を見直すべきです。

* * *

この他に、`make_unique()`を使う場合、`make_unique()`からコンストラクターを呼び出すことになりますので必然的にコンストラクターを`public`にする必要があります。

[code]

    class Test {
        Test() = default;
    public:
        static auto create() {
            return std::make_unique<Test>();    // error
        }
    };
    
[/code]

* * *

蛇足ですが、`malloc()`もメモリ確保だけを行い初期化しませんが、`calloc()`はゼロクリアします。

