2014-07-24 113 views
1

我需要在共享內存中創建一個結構。這是類的一個實例:使用類內部的類提升進程間共享內存

struct A{ 
std::string str1; 
int val; 
} 
struct B{ 
    A inner; 
    std::string name; 
} 

我找不到這樣的例子在網絡,但是一些搜索後,我能看到,我可能需要實現一些分配器,以及類型,如字符串不應該被用來作爲裸露, 所以我創建的字符串的分配,看起來像這樣:

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

您應該嘗試使用char而不是std :: string。

struct A{ 
char str1[64]; 
int val; 
}; 

struct B{ 
A inner; 
char name[64]; 
}; 
0

安置新的也許可以幫助。假設你有一個指針被一些未知的手段創建的共享內存:

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,而不是從共享內存的角度來看。

因此,只要在映射到共享內存的各種結構中沒有引用或指針,就可以執行所嘗試的操作。