提升进程间共享内存删除对象而不破坏

时间:2017-05-05 10:15:21

标签: c++ boost

我在Windows上有一个boost进程managed_shared_memory,我有一个存储在其中的boost进程间向量。矢量由

创建或打开
auto* vec = shm.find_or_construct< MyVector >( "Data" )( shmAllocator );

如boost进程间示例中所述。我的观点是,我现在构建或打开了一个引用共享内存中对象的对象vec。我检查了vec的d'tor仅在我使用shm.destroy<MyVector>("Data")时调用,如果我调用delete vec应用程序崩溃。

现在我如何正确释放对象“vec”而不会破坏底层数据? 完整的场景:

  • 两个用户正在运行我的软件,通过共享内存共享数据(在使用文件模拟的窗口中)
  • 一个用户退出软件,如果我没有打电话destroy我有内存泄漏,如果我按升级文档中的说明调用它:
  

在Windows操作系统中,当前版本支持通常可接受的UNIX取消链接行为模拟:文件使用随机名称重命名,并在最后打开句柄关闭时标记为删除

  • 其他用户启动软件并尝试共享内存,但由于文件已重命名,因此无法与我软件的其他正在运行的实例共享内存。

1 个答案:

答案 0 :(得分:1)

  

通过

创建或打开矢量

这略微混淆了概念。它抬头,必要时构建。 (open_or_create适用于实际的可共享对象,如内存映射或共享内存对象。)

  

我检查过vec的数据仅在我使用shm.destroy<MyVector>("Data")时调用,如果我调用delete vec应用程序崩溃。

这两者都是设计的。

  

一个用户退出软件,如果我不调用destroy,我有内存泄漏,

不是真的。如果您不销毁该向量,它仍然存在于托管段中。这意味着您可以重新打开共享内存段并仍然可以在那里找到它。

要删除共享细分,请使用remove()

docs说这与此相关:

  

当managed_mapped_file对象被销毁时,文件将自动取消映射,并释放所有资源。要从文件系统中删除文件,您可以使用标准C std::remove或Boost.Filesystem的remove()函数,但如果任何进程仍将文件映射到内存或文件中,则文件删除可能会失败任何过程都是开放的。

     

要获得更便携的行为,请使用f ile_mapping::remove(const char *)操作,即使文件已被映射,也会删除该文件。但是,如果文件(例如,通过C ++文件流)并且没有为文件授予删除共享权限,则在某些OS系统中删除将失败。但在大多数常见情况下,file_mapping::remove足够便携。

here

  
      
  1. ~basic_managed_mapped_file();
  2.         

    销毁*this并指示使用资源完成调用过程。析构函数将释放系统分配的任何系统资源,供此进程使用此资源。仍然可以再次打开资源,调用open构造函数重载。要从系统中删除资源,请使用remove()

其他信息

如果你真的只想让矢量在最后一个用户发布后消失,请使用进程间的shared_pointer:http://www.boost.org/doc/libs/1_64_0/doc/html/interprocess/interprocess_smart_ptr.html#interprocess.interprocess_smart_ptr.shared_ptr