make_sharedのつかいかたを調べようとしたらstd::make_shared ~ただのヘルパじゃない!というのをみ、make_sharedをつかうとメモリをひと塊でallocateしてくれることを知った。 速くなってるらしいし

確認ってことで、こんなプログラムをつくってみて

#include <memory>
#include <cstdlib>
#include <iostream>

void* operator new(size_t sz) { std::cout << sz << std::endl; return malloc(sz); }
void operator delete(void* p) { free(p); }

struct A {
    char buf[1000];
    A() {}
};

int
main()
{
    std::cout << "make_shared" << std::endl;
    auto a = std::make_shared<A>();
    std::cout << "---" << std::endl;

    std::cout << "new+shard_ptr" << std::endl;
    std::shared_ptr<A> a2 (new A);
    std::cout << "---" << std::endl;

    for (;;) ;
}

実行

% g++47 -std=gnu++0x -g foo.cc
% ./a.out
make_shared
1032
---
new+shard_ptr
1000
24
---
^C

ヘッダファイルをみても詳細は理解できなかったが、実行結果からは確かにカウンタとオブジェクトを一緒にallocateしている。

これが理由でmake_sharedにdeleterを指定できないんだろうなぁ、きっと。