我试图将一个任意元素的向量存储在一个内存映射文件中(现在我试图用一个int向量来成功但它应该与任意对象的向量一起工作)。我已经找到了大量关于使用共享内存的文档,但没有找到适当的内存映射文件。由于我已经在内存映射文件中成功制作和使用了R-tree(就像在that example中),我试图用向量复制过程,但我想我错过了一些关键元素,因为它不起作用。这是我的代码:
namespace bi = boost::interprocess;
typedef bi::allocator<std::vector<int>, bi::managed_mapped_file::segment_manager> allocator_vec;
std::string vecFile = "/path/to/my/file/vector.dat";
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), 1000);
allocator_vec alloc_vec(file_vec.get_segment_manager());
std::vector<int> * vecptr = file_vec.find_or_construct<std::vector<int> >("myvector")(alloc_vec);
可能我的最后一行是错的,因为“alloc_vec”作为参数传递给向量构造函数,它不期望它
(我得到的错误是/usr/include/c++/4.8/bits/stl_vector.h:248:7: note: candidate expects 0 arguments, 1 provided
)。
但是,我不知道如何将分配器传递给find_or_construc(),我认为这对于在内存映射文件中正确创建向量至关重要。在最后一行的末尾删除(alloc_vec)
会导致另一个我无法解决的错误:
error: cannot convert ‘boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index>::construct_proxy<std::vector<int> >::type {aka boost::interprocess::ipcdetail::named_proxy<boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index>, std::vector<int>, false>}’ to ‘std::vector<int>*’ in initialization
std::vector<int> * vecptr = file_vec.find_or_construct<std::vector<int> >("myvector");
任何帮助将不胜感激。
答案 0 :(得分:2)
与示例展示一样,告诉vector类关于自定义分配器,而不是
typedef std::vector<int> MyVec;
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(alloc_vec);
使用
typedef bi::allocator<int, bi::managed_mapped_file::segment_manager> int_alloc;
typedef std::vector<int, int_alloc> MyVec;
int_alloc alloc(file_vec.get_segment_manager());
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(alloc);
请注意
vector
使用分配器作为元素类型(不适用于vector; segment_manager分配它)allocator<>
的构造函数是隐式的,您也可以只传递segment_manager
:<强> Live On Coliru 强>
#include <boost/interprocess/managed_mapped_file.hpp>
namespace bi = boost::interprocess;
int main() {
std::string vecFile = "vector.dat";
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), 1000);
typedef bi::allocator<int, bi::managed_mapped_file::segment_manager> int_alloc;
typedef std::vector<int, int_alloc> MyVec;
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(file_vec.get_segment_manager());
vecptr->push_back(rand());
}