升级分解共享内存删除对象而无需销毁
Boost interprocess shared memory delete object without destroy
我在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
足够便携。
和这里:
~basic_managed_mapped_file();
破坏
*this
并指示使用资源完成了调用过程。DESTRUCTOR函数将处理该过程用于此资源的系统用于此过程的任何系统资源。仍然可以再次打开该资源,调用打开的构造函数过载。从系统中删除资源,请使用remove()
附加信息
.interprocess_smart_ptr.shared_ptr- 线程调用的函数对对象删除是否安全?
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 使用 com 对象删除计划任务
- C 将对象删除为参考
- C样式对象删除的包装器
- 静态映射中动态分配的对象.删除必要的
- C++指向对象删除的指针数组,"Debug assertion failure!"
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- Python 对象删除检测
- C++安全对象删除
- Qt:RemoveWidget和对象删除
- Qt对象删除导致崩溃
- 删除由两个shared_pointer实例管理的对象(删除其中一个)
- 顶点缓冲区对象(删除进程)opengl
- 设计 -- 按名称或对象删除
- 提升中的异常:进程间,共享内存对象删除
- 使用std::function和std::bind来存储回调并处理对象删除
- 如何使用智能指针防止双重对象删除
- 指针指向对象删除时自动为空
- 对象层次结构中的对象删除责任