c++ - 将进程间管理的共享内存原始指针 boost 为类成员

标签 c++ pointers boost boost-interprocess

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

我的问题是主程序段错误。我想绝对原始指针会导致问题。我试图将原始指针更改为 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;
}

关于c++ - 将进程间管理的共享内存原始指针 boost 为类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24006319/

相关文章:

c++ - 在 C++ Builder 中编译 Boost 库时的警告

c++ - 是否可以检查变量的存在?

c++ - Qt QThread 使用信号/插槽从工作人员到 gui 的问题

c++ - 在与 OpenMP 并行化的嵌套 for 循环中写入共享数组(通过指针)如何产生错误结果?

pointers - 如何检查嵌套指针中的值

c++ - 使用具有不同纹理尺寸的 OpenGL glTexture3D 倾斜体积数据

c++ - 使用 conan 仅安装 boost 的一部分

c++ - 你能推荐一些关于 Linux 上 Epoll 的指南吗?

c++ - 如何从 C++ 中的一组对象指针打印?

C++ 函数返回指向结构的指针变得奇怪