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