1

我希望在一個進程中在共享內存段上分配數據,並在另一個進程中釋放它。跨進程內存管理

我使用以下行分配它在過程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我招人煩一個惱人的異常:「未處理的異常在0x0000000000000000」 並嘗試使用deallocate(pData)並沒有表現好。

當我從Proc1中釋放一切都很好時,它只是從Proc2中釋放出現問題。

任何想法?


該問題是由基類中的虛擬析構函數引起的。 注意自我:不要在共享內存上使用虛擬功能,虛擬方法表不是交叉過程。

我想感謝乍得。他正確地指出,我應該發佈相關的代碼,讓我仔細看看一個不起眼的基類。

+1

使用'managed_memory_segment.construct '創建的對象應該用'managed_memory_segment.destroy '或'managed_memory_segment.destroy_ptr'釋放。沒有一個可重複使用的例子(或者更多的代碼),沒有人能夠幫助你。 – Chad

+0

對,我會在明天早上回到辦公室時嘗試添加更全面的示例。至於「破壞」的建議,這顯然不適用於anonymous_instance。也許我應該重新思考我的前提,並轉向命名實例。 – Eyal

回答

1

我衷心建議使用智能指針,就像使用非進程間分配一樣。

當然,除非refcount/weakref也分配在共享內存段中,否則常規shared_ptr不會削減它。

幸運的是,提振進程間配備了齊全的指控

  • 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<>,​​,甚至是intrusive_ptr<>您所有的特殊需求:)