【发布时间】: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