我希望在一个进程中在共享内存段上分配数据,并在另一个进程中释放它。
我使用以下行在进程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的解除分配似乎有问题。
任何想法?
问题是由基类中的虚拟析构函数引起的。 自我注意:不要在共享内存上使用虚函数,虚方法表不是交叉过程。
我要感谢乍得。他正确地指出我应该发布相关的代码,这些代码使我仔细研究了一个不起眼的基类。
答案 0 :(得分:1)
我衷心建议使用智能指针,就像使用非进程间分配一样。
当然,除非refcount / weakref也在共享内存段中分配,否则常规shared_ptr
不会删除它。
幸运的是,Boost Interprocess充满了
boost::interprocess::shared_ptr<T>
boost::interprocess::make_shared<T>(...)
还有scoped_ptr<>
,unique_ptr<>
甚至intrusive_ptr<>
满足您的所有特殊需求:)