我知道這很奇怪,但我只是玩得開心。在進程之間移動STL對象
我試圖發送一個std::map
經由插座兩個機器之間的兩個過程之間(使用放置在存儲器的固定區域新實例化):Master
和Slave
。我使用的地圖有此typedef
:
// A vector of Page objects
typedef
std::vector<Page*,
PageTableAllocator<Page*> >
PageVectorType;
// A mapping of binary 'ip address' to a PageVector
typedef
std::map<uint32_t,
PageVectorType*,
std::less<uint32_t>,
PageTableAllocator<std::pair<uint32_t, PageVectorType*> > >
PageTableType;
的PageTableAllocator<T>
類是負責分配內存的任何STL容器可能想/需要到內存中的固定位置。例如,所有Page
對象和STL內部結構正在這個固定存儲器區域中被實例化。這確保std::map
對象和分配器都是兩個放置在一個固定的內存區域。我已經使用GDB來確保映射和分配器的行爲正確(所有使用的內存在固定區域,應用程序的正常堆棧上都沒有任何內存)。
假設Master
啓動時,初始化它的所有STL結構和特殊的內存區域,將出現以下情況。 Slave
開始,打印出其版本的頁表,然後查找Master
。 Slave
找到一個主文件,刪除其版本的頁表,複製Master
的版本的頁表(和特殊內存區域),併成功將其打印出Master
的頁表版本。從我在GDB中完成的操作中,我可以執行許多隻讀操作。
嘗試添加到新複製的PageTableType
對象時,Slave
錯誤在分配器的void construct (pointer p, const T& value)
方法中。作爲p
傳入的值指向已分配的內存區域(根據Master
的版本std::map
)。
我不知道C++對象結構什麼,但我猜從Slave
的版本的PageTableType
必須即使我被掛在該對象的狀態全部更換內存的PageTableType
及其分配使用。 我的問題是,如果這是一個有效的關注。 C++是否在對象實例化的內存區域之外維護某種對象狀態?
所有在地圖中使用的對象都是非POD。分配器也是如此。
您在哪裏存儲確定共享內存哪部分已被分配的元數據? – 2012-02-11 20:37:24
我在應用程序中重新定義了所有對內存分配代碼('malloc','free'等)的調用。當一個節點分配內存時,偏移記錄在這個'std :: map'對象中。當「從屬」嘗試更新地圖時(傳輸後),它會發生故障。 – sholsapp 2012-02-11 20:41:21
這就是我的意思。記錄*其中*? – 2012-02-11 20:41:42