提升进程间托管共享内存原始指针作为类成员



我想使用一个名为ShmObj的类访问托管共享内存对象的数据信息,并将指向共享对象的原始指针作为私有成员,如下面的代码块所示。

我的问题是主要的程序分段错误。我猜是绝对的原始指针导致了这个问题。我试图将原始指针更改为bi::offset_ptr,但没有帮助。如有任何帮助,不胜感激。

ShmObj.h

#include <string>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace bi = boost::interprocess;
class ShmObj {
public:
    ShmObj() {
        bi::managed_shared_memory segment(bi::open_only, "shm");
        pNum = segment.find<int>("Number").first;
    }
    int getNumber() {return *pNum;}
    virtual ~ShmObj() {}
private:
    int* pNum;
};

main.cpp

#include "ShmObj.h"
#include <iostream>
int main() {
    ShmObj X;
    std::cout << X.getNumber() << std::endl;
}

您的共享内存段在构造函数结束时被销毁…将其移动到一个字段以延长其生存期:

#include <string>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace bi = boost::interprocess;
class ShmObj {
public:
    ShmObj() 
      : segment(bi::open_or_create, "shm", 32ul*1024),
        pNum(0)
    {
        pNum = segment.find_or_construct<int>("Number")(0);
    }
    int getNumber() {
        assert(pNum);
        return *pNum;
    }
    virtual ~ShmObj() {}
private:
    bi::managed_shared_memory segment;
    int* pNum;
};
#include <iostream>
int main() {
    ShmObj X;
    std::cout << X.getNumber() << std::endl;
}

最新更新