boost::interprocess::managed_external_buffer を使用していますが、特定のアドレスにそのようなバッファーを作成しようとすると、次のエラー (アサーションの失敗) が発生します。
/homes/mdorier/local/include/boost/interprocess/managed_external_buffer.hpp:67: boost::interprocess::basic_managed_external_buffer::basic_managed_external_buffer(boost::interprocess::create_only_t, void*, typename boost::interprocess::ipcdetail: :basic_managed_memory_impl::size_type) [with CharType = char, AllocationAlgorithm = boost::interprocess::rbtree_best_fit, 0ul>, IndexType = boost::interprocess::iset_index]: アサーション `(0 == (((std::size_t) addr) & (AllocationAlgorithm::Alignment - size_type(1u))))' が失敗しました。
managed_external_buffer.hpp の 67 行目は、次の関数の BOOST_ASSERT ステートメントに対応しています。
//!Creates and places the segment manager. This can throw
basic_managed_external_buffer
(create_only_t, void *addr, size_type size)
{
//Check if alignment is correct
BOOST_ASSERT((0 == (((std::size_t)addr) & (AllocationAlgorithm::Alignment - size_type(1u)))));
if(!base_t::create_impl(addr, size)){
throw interprocess_exception("Could not initialize buffer in basic_managed_external_buffer constructor");
}
}
私のコードは、GCC 4.6.2 を搭載した Ubuntu i686 で正常に動作します。上記のエラーは、GCC 4.4.3 を使用する Ubuntu x86_64 で表示されます。
あるプラットフォームではエラーが発生しないのに、別のプラットフォームではメモリの配置が重要であるように見えるのはなぜですか?
managed_external_buffer がアドレスを調整することを望んでいる場合は、それで問題ありませんが、少なくともどの値を提供するかを知っておく必要があります。どうやってやるの?
ありがとうございました