STLもmanaged上ならば使用可能
[注意] この記事は間違っている可能性が高いです
できるのかなーと思っていたんですが、managed上であればsegment_managerを使用したアロケータを作成すればSTLコンテナをそのまま利用できるようです。(じゃあなんで同じようなコンテナがboost.interprocess内には入ってるんだろうか…STL用アロケータを用意すればよかったのでは?)get_segment_managerで受け取ったsegment managerを受け取って作成できるようになっていれば問題ないようです。
#include <boost/interprocess/managed_shared_memory.hpp> #include <boost/interprocess/allocators/allocator.hpp> #include <vector> template<class T,class SegmentManager> class MySTL_allocator { /* segment_managerの使い方がよくわからなくて挫折. そのうち書きますorz */ }; int main() { namespace bip = boost::interprocess; // shared memoryで作成したオブジェクトは残るので手動で削除する必要がある struct shared_memory_deleter { shared_memory_deleter() { bip::shared_memory_object::remove("MySharedMemory"); } ~shared_memory_deleter() { bip::shared_memory_object::remove("MySharedMemory"); } } shm_deleter; bip::managed_shared_memory shared_memory( bip::create_only, "MySharedMemory", 4096 ); bip::managed_shared_memory::segment_manager* manager = shared_memory.get_segment_manager(); // segment_managerを使ったアロケータ typedef MySTL_allocator<int,bip::managed_shared_memory::segment_manager> stl_allocator; stl_allocator allocator(manager); // 上記のアロケータを使ってSTLのvectorを作成 typedef std::vector<int,stl_allocator> MyVector; MyVector* vec = shared_memory.construct<MyVector>("MyVector_Instance")(allocator); }
ちなみに、interprocessが持っているアロケータを渡しても内部でこけます。allocateメソッドなどがinterprocess.offset_ptrで返却してるのが原因のようです。(やっぱりSTL用アロケータを用意すれば良かったんじゃないかなあ?)
追記)上記のコードで自作アロケータクラスのテンプレート引数は2個ですが、std::allocatorと合わせておいた方が良いと思います。