我正在使用 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) [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 要我对齐地址,我可以接受,但我至少应该知道要提供什么值。我怎样才能做到这一点?
谢谢