跨进程内存管理

时间:2015-07-20 16:07:03

标签: c++ memory-management boost shared-memory boost-interprocess

我希望在一个进程中在共享内存段上分配数据,并在另一个进程中释放它。

我使用以下行在进程1(Proc1)中分配它: new_Class* pData = managed_windows_shared_memory_segment.construct<new_Class>(anonymous_instance) ()

然后我将指针转换为句柄get_handle_from_address(pData),将其转移到另一个进程(Proc2)将其转换回指针static_cast<new_Class*>managed_windows_shared_memory_segment.get_address_from_handle(handle)并尝试在那里解除分配。 (在Proc1去世后我可能会补充)

当我尝试使用destroy_ptr(pData)在proc 2中解除分配时 我讨厌一个恼人的异常:&#34; 0x0000000000000000处的未处理异常&#34; 并尝试使用deallocate(pData)并不会更好。

当我从Proc1解除分配时,一切都很好,它只是来自Proc2的解除分配似乎有问题。

任何想法?

问题是由基类中的虚拟析构函数引起的。 自我注意:不要在共享内存上使用虚函数,虚方法表不是交叉过程。

我要感谢乍得。他正确地指出我应该发布相关的代码,这些代码使我仔细研究了一个不起眼的基类。

1 个答案:

答案 0 :(得分:1)

我衷心建议使用智能指针,就像使用非进程间分配一样。

当然,除非refcount / weakref也在共享内存段中分配,否则常规shared_ptr不会删除它。

幸运的是,Boost Interprocess充满了

  • boost::interprocess::shared_ptr<T>
  • boost::interprocess::make_shared<T>(...)

请参阅http://www.boost.org/doc/libs/1_58_0/doc/html/interprocess/interprocess_smart_ptr.html#interprocess.interprocess_smart_ptr.shared_ptr

还有scoped_ptr<>unique_ptr<>甚至intrusive_ptr<>满足您的所有特殊需求:)