我正在尝试使用 boost::interprocess 创建一个能够与共享内存段内的容器元素连接的包装函数。但是由于某种原因,容器元素仅在包装函数内部可用,尽管共享内存段对象位于全局范围内。现在真正让我感到困惑的是,当我将连接例程放在我的主函数中的不同范围内时,离开连接例程的范围后容器仍然可用。
我的连接例程:
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <iostream>
namespace bi = boost::interprocess;
bi::managed_shared_memory segment(bi::open_only, "MySharedMemory");
template <class T>
void smVariableConnect(const char* smVariableDescriptor, T* out_smVariable)
{
std::pair<T*, std::size_t> resource;
resource = segment.find<T>(smVariableDescriptor);
assert(resource.second == 1);
out_smVariable = resource.first;
for(unsigned int i = 0; i < out_smVariable->size(); i++) // This works fine
std::cout << (*out_smVariable)[i] << std::endl;
}
int main ()
{
namespace bi = boost::interprocess;
typedef bi::allocator<int, bi::managed_shared_memory::segment_manager> ShVectorAllocator;
typedef bi::vector<int, ShVectorAllocator> SharedVector;
SharedVector* sv = nullptr;
/* **1**
{
std::pair<SharedVector*, std::size_t> res;
res = segment.find<SharedVector>("sharedVector");
assert(res.second == 1);
sv = res.first;
}
*/
/* **2** */
smVariableConnect<SharedVector>("sharedVector", sv);
/* */
// Workds fine when using method 1, crashes when using method 2
for(unsigned int i = 0; i < sv->size(); i++)
std::cout << (*sv)[i] << std::endl;
std::cin.get();
return 0;
}
创建共享内存段并将向量容器推入其中的应用程序的源代码可以在这里找到http://pastebin.com/QHpwNVZ0(为什么没有可用的扰流器功能 Oo)