其他分享
首页 > 其他分享> > c-使用STL容器进行boost :: interprocess :: managed_shared_memory

c-使用STL容器进行boost :: interprocess :: managed_shared_memory

作者:互联网

请考虑以下情况:

class Helper
{
    public:
        // Getters and setters are present!
    private:
        int i;
        std::map<int, boost::interprocess::managed_shared_memory> shm;
}

int main()
{
    boost::interprocess::managed_shared_memory shmInfo(boost::interprocess::open_or_create, "Test", 1024);

    boost::interprocess::map<int, Helper> myMap = shmInfo.construct< boost::interprocess::map<int, Helper> >("Memory");
}

myMap(是int和Helper的映射)是在shared_memory上构造的.反过来,我希望Helper持有一个int和boost :: interprocess :: managed_shared_memory的映射.

当我尝试在Helper中使用std :: map时,出现编译器错误:

error C2248:
‘boost::interprocess::basic_managed_shared_memory::basic_managed_shared_memory’
: cannot access private member declared in class
‘boost::interprocess::basic_managed_shared_memory’

我该如何实现?

解决方法:

好的,这是一个可以正常工作的版本Live On Coliru

让我解决您的代码遇到的一些问题:

>让我们从顶部开始

class Helper
{
    public:
        // Getters and setters are present!
    private:
        int i;
        std::map<
-----------^

>对于共享内存分配器,使用std :: map时常会遇到麻烦,因为它直接在构造函数中进行分配. boost :: container :: map和boost :: interprocess :: map不会,因此在使用Boost Interprocess分配器时应首选它们.使用模板别名,可以减少声明这种共享映射的复杂性:

06001

现在,您可以“仅”说出shared_map< K,V>您之前曾说过std :: map< K,V>的地方.

                  int, boost::interprocess::managed_shared_memory> shm;
--------------------------------------------^

>这里有两点:

> boost :: interprocess :: managed_shared_memory不可复制(因为它拥有共享的内存资源).在我的示例中,我使用了shared_ptr< managed_shared_memory>解决此问题.如果您确定对象的生存期将长于包含该指针的映射的生存期,则可以使用原始指针.
>在驻留在共享内存中的Helper类中具有标准分配的容器是没有意义的(std :: map将仅指向本地进程堆上的对象,并在从另一个进程引用时指向UB).因此,您应该指定一个Boost进程间分配器,以将容器元素放入共享内存中.出于技术原因,这意味着您必须指定键比较器(尽管这只是默认值std :: less< K>).

}
-^

失踪;

标签:c,boost,stdmap,boost-interprocess
来源: https://codeday.me/bug/20191013/1908639.html