shared_ptr 具有动态分配内存和 mmap 内存

shared_ptr with dynamic allocated memory and with mmap-ed memory

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

在不同的地方,我正在访问相同的 struct,但是在 mmap-ed 内存上。

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

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

经过一些研究,对于 MMAP 相关的案例,我做了自定义删除器,什么都不删除。

static void null_deleter(void *){
    // null_deleter
}

...

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

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

您可以使用 std::shared_pointeraliasing constructor:

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 是实时的。