升级分解共享内存删除对象而无需销毁

Boost interprocess shared memory delete object without destroy

本文关键字:对象 删除 分解 共享 内存      更新时间:2023-10-16

我在Windows上有一个Boost Inversocess Managed_shared_memory,并且我在其中存储了一个boost intercess vector。向量是由

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

如提升概述示例中所述。我的观点是,我现在构造或打开了一个对象vec引用共享内存中的对象。我检查了VEC的d'Tor仅在使用shm.destroy<MyVector>("Data")时才调用,如果我调用delete vec claply。

现在,如何在不破坏基础数据的情况下正确发布对象" VEC"?完整的方案:

  • 两个用户正在运行我的软件,通过共享内存共享数据(在使用文件模拟的Windows中(
  • 一个用户退出软件,如果我不调用 destroy,我会有内存泄漏,如果我确实按照boost文档中的规定称呼它:

在Windows操作系统中,当前版本支持UNIX UNINK行为的通常可接受的仿真:该文件用随机名称重命名并在关闭最后一个开放式句柄时被标记为删除

  • 另一个用户启动该软件,并试图共享内存,但是随着文件的重命名,它无法与我的软件的另一个运行实例共享内存。

向量是由

创建或打开的

这有点混合概念。它已抬起头来,并在必要时进行构造。(open_or_create适用于实际可共享对象,例如内存映射或共享内存对象(。

我检查了VEC的d'Tor仅在我使用shm.destroy<MyVector>("Data")时才调用,如果我调用delete vec,则应用程序崩溃。

这两个都是设计。

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

不是真的。如果您不破坏矢量,它仍然存在于托管细分市场中。这意味着您可以重新打开共享内存段并仍然在那里找到它。

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

文档说这与此相关:

当托管_mapped_file对象被销毁时,文件将自动未上限,所有资源将被释放。要从文件系统中删除文件,您可以使用标准的C std::remove或BOOST.FILESYSTEM的remove()函数,但是如果任何进程仍在存储器中映射的文件或通过任何过程打开文件,则删除文件可能会失败。

>

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

和这里:

  1. ~basic_managed_mapped_file();

破坏*this并指示使用资源完成了调用过程。DESTRUCTOR函数将处理该过程用于此资源的系统用于此过程的任何系统资源。仍然可以再次打开该资源,调用打开的构造函数过载。从系统中删除资源,请使用remove()

附加信息

.interprocess_smart_ptr.shared_ptr