【问题标题】:Cross process memory managment跨进程内存管理
【发布时间】:2015-10-09 20:32:07
【问题描述】:

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

我使用以下行在进程 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 死后我可能会添加)

当我尝试在 proc 2 中使用 destroy_ptr(pData) 释放它时 我讨厌一个烦人的异常:“0x0000000000000000 处的未处理异常” 并尝试使用deallocate(pData) 并没有更好的结果。

当我从 Proc1 解除分配一切正常时,只是从 Proc2 解除分配出现问题。

有什么想法吗?


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

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

【问题讨论】:

  • 使用managed_memory_segment.construct<MyType> 创建的对象应该使用managed_memory_segment.destroy<MyType> 或managed_memory_segment.destroy_ptr 释放。如果没有可重现的小示例(或查看更多代码),任何人都无法为您提供帮助。
  • 对,明天早上我回到办公室时,我会尝试添加一个更全面的示例。至于“destroy”的建议,这显然不适用于anonymous_instance。也许我应该重新考虑我的前提并转向命名实例。

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


【解决方案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<> 可以满足您的所有特殊需求:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2014-05-22
    • 2011-01-16
    • 2012-02-13
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多