我需要在共享内存中创建一个结构。这是类的一个例子:
struct A{
std::string str1;
int val;
}
struct B{
A inner;
std::string name;
}
我在网上找不到这样的例子,但经过一些搜索后我才能看到我可能需要实现一些分配器,并且像string这样的类型不应该用作裸, 所以我为字符串创建了一个分配器,如下所示:
typedef allocator<char, ip::managed_shared_memory::segment_manager> char_alloc
class String2: public ip::basic_string<char, std::char_traits<char>, char_alloc > { public:
String2(char_alloc& _all): ip::basic_string<char, std::char_traits<char>, char_alloc >(_all) {;} };
但是现在我有一些问题试图理解我如何为这两个类创建一个像这样工作的分配器。
有没有人有类似这样的例子?
提前致谢
答案 0 :(得分:0)
你应该尝试使用char而不是std :: string。
struct A{
char str1[64];
int val;
};
struct B{
A inner;
char name[64];
};
答案 1 :(得分:0)
Placement new也许有帮助。假设您有一个指向通过某种未知方式创建的共享内存的指针:
void* some_shared_mem; // initialized somehow
B* shared_B = new (some_shared_mem) B; // call the B constructor.
share_B->A.val = 5;
但是,你不应该把任何东西放到分配指针的共享内存中。即使您保证这些指针返回共享内存,也无法确定共享内存的每个进程都看到共享内存位于同一地址。 some_shared_mem
在程序中可能为0x10000,在某些其他程序中可能为0x20000。因此,即使共享指针是从共享内存中分配的(例如0x10010),映射为0x20000的程序也会将该点视为0x10010,从其角度来看,它不在共享内存中。
只要在映射到共享内存的各种结构中没有引用或指针,您就可以执行您尝试的操作。
答案 2 :(得分:0)
这个答案来得有点晚,但是,为了将来参考,Interprocess库的"Containers of containers"部分具有此确切的用例。