具有动态分配内存和映射内存的Shared_ptr

shared_ptr with dynamic allocated memory and with mmap-ed memory

本文关键字:内存 Shared ptr 动态分配 映射      更新时间:2023-10-16

对于我的项目,我使用shared_ptr动态分配struct

在不同的点,我访问相同的struct,但在映射的内存。

是否有一些技巧,我可以使用shared_ptr,所以不重复现有的代码?例如,实际上不删除的自定义删除器?

我意识到这仍然是有风险的,但它将在很短的时间内完成-在函数体内,我不想复制整个结构体,只是为了在它上面运行一些简单的函数。

您可以使用std::shared_pointer别名构造函数:

std::shared_ptr shm;  // points at mmap'ed region, with munmap deleter
Foo *p; // somewhere within this region
auto shared_p = std::shared_ptr{p, shm};

这将增加shm的引用计数,而shared_p是活的

经过一番研究,对于MMAP相关的案例,我做了一个不删除任何内容的自定义删除器。

static void null_deleter(void *){
    // null_deleter
}
...
void abc(Blob *p){
    mySharedPtr.reset(p, null_deleter);
}

查看boost进程间库,该库允许在内存中创建由mmap()创建的文件对象。它们有一些可重定位的指针,能够指向同一内存区域内的对象,并将该区域映射到不同的位置。不支持的是重新定位虚拟函数表——他们对此进行了讨论。但我认为这只适用于,如果您有不同版本的可执行文件或虚拟方法表位于共享库中。