2011年12月19日14:54make_shared
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を指定できないんだろうなぁ、きっと。