提升::进程间managed_shared_memory指针有效作用域

Boost::interprocess managed_shared_memory pointer effective scope

本文关键字:指针 有效 作用域 memory shared managed 提升 进程      更新时间:2023-10-16

我只使用 boost::interprocess::managed_shared_memory 在内存中创建共享向量,我已经成功创建了共享内存,我发现当我读取向量时,可以读取和打印注释 1 中向量中的所有元素,但是当离开向量 g/gr 的初始化范围时,即在 main 函数中, 我不能再访问矢量内容了,程序说地址映射错误,但地址是一样的,为什么呢?谁能回答?谢谢!

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
typedef boost::interprocess::allocator<boost::interprocess::vector<int>, boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocator;
typedef boost::interprocess::vector<boost::interprocess::vector<int>, ShmemAllocator> Shmem2DVector;
class TestVector{
public:
    Shmem2DVector *g;
    Shmem2DVector *gr;
    TestVector{
        boost::interprocess::managed_shared_memory segment(boost::interprocess::open_only, "shmem");
        g = segment.find<Shmem2DVector>("myVector").first;
        gr = segment.find<Shmem2DVector>("myVector").first;
        //1. print vector g/gr and size of vector g/gr
    }
};
int main(){
    TestVector test_vec();
    //2. print vector g/gr and size of vector g/gr
    return 0;
}

一旦离开构造函数,managed_shared_memory对象就会被销毁。尝试将类定义更改为以下内容:

class TestVector
{
public:
    Shmem2DVector *g;
    Shmem2DVector *gr;
    TestVector()
        : segment(boost::interprocess::open_only, "shmem")
    {
        g = segment.find<Shmem2DVector>("myVector").first;
        gr = segment.find<Shmem2DVector>("myVector").first;
    }
private:
    boost::interprocess::managed_shared_memory segment;        
};