ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-13 15:07:06  阅读:414  来源: 互联网

标签:c boost stdmap boost-interprocess


请考虑以下情况:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有