C++のstd::shared_ptrを使うと、operartor newが2回呼ばれるけど、std::make_sharedを使うと1回で済むらしい!

こんにちは。ヤマヤタケシです。ちょっとしたコードを書いて達成感を味わいたい今日このごろなので、書きましょう。

今日はたまたまスゴイ情報を手に入れました。


C++プログラマーよ!std::make_sharedを安易に使うべからず!
で検証されていますが、後追いで実験してみましょう。

// std::make_sharedのテスト
// 2015/5/08 yamaya takeshi
#include <memory>
#include <cstdlib>
#include <iostream>

void *operator new( size_t size)
{
    void *p = std::malloc( size );
    std::cout << "new " << p << " " << size << std::endl;

    return p;
}

void operator delete( void *p )
{
    std::cout << "delete" << p << std::endl;
    std::free( p );
}

int main()
{
    std::cout << "--use shared_ptr--" << std::endl;
    {
        std::shared_ptr<int> p1( new int(5) );
        std::cout << *p1 << std::endl;
    }
    std::cout << "--use make_shared--" << std::endl;
    {
        std::shared_ptr<int> p2 = std::make_shared<int>(6);
        std::cout << *p2 << std::endl;
    }
    return 0;
}
all:
	g++ test_make_shared.cpp -std=c++11 -o test_make_shared.exe 
	./test_make_shared
make -k 
g++ test_make_shared.cpp -std=c++11 -o test_make_shared.exe 
./test_make_shared
--use shared_ptr--
new 0x600048930 4
new 0x600048950 24
5
delete0x600048930
delete0x600048950
--use make_shared--
new 0x600048930 24
6
delete0x600048930

確かに、make_shared版の方がnewとdeleteの回数が減ってます!なんてこった!shared_ptrを使わない理由がまた1つ減りましたね。C++の進化は止まりませんね。

ちなみに、Factory Method で生成するときに Constructor が Private だった場合にmake_sharedが使えない!という問題は、std::make_shared から private コンストラクタを呼び出すとすればいいようです。

C++は奥深すぎてヤバイですね。

そんじゃまた。