gpt4 book ai didi

c++ - 跨进程内存管理

转载 作者:行者123 更新时间:2023-11-30 05:40:39 28 4
gpt4 key购买 nike

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

我使用以下行在进程 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 解除分配似乎有问题。

有什么想法吗?


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

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

最佳答案

我诚挚地建议使用智能指针,就像处理非进程间分配一样。

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

幸运的是,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<>满足您所有的特殊需求:)

关于c++ - 跨进程内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521239/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com