我在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取消链接行为模拟:文件使用随机名称重命名,并在最后打开句柄关闭时标记为删除
答案 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:
- 醇>
~basic_managed_mapped_file();
销毁
*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