2012-02-11 14 views
4

これは奇妙なことですが、私はただ楽しんでいます。プロセス間でSTLオブジェクトを移動する

MasterSlaveの2つのマシン間のソケットを介して2つのプロセス間でstd::map(メモリの固定領域で新しい配置を使用してインスタンス化)を送信しようとしています。私が使用しているマップがあり、この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オブジェクトにアロケータのvoid construct (pointer p, const T& value)メソッドのSlaveフォルトを追加しようとすると、 pとして渡された値は、既に割り当てられたメモリ領域を指しています(Masterのバージョンstd::map)。

私はC++オブジェクト構造について何も知らないが、私はPageTableTypeSlaveのバージョンからオブジェクトの状態は、私がPageTableTypeとそのアロケータを使用しているメモリのすべてを交換した後もぶらぶらしなければならないことを推測しています。 私の質問は、これが有効な懸念事項であるかどうかです。 C++はオブジェクトがインスタンス化されたメモリの領域外にある種のオブジェクト状態を維持していますか?

マップで使用されているオブジェクトはすべてPODではありません。同じことがアロケータにも当てはまります。

+0

共有メモリのどの部分が割り当てられているかを決定するメタデータをどこに保存しますか? –

+0

私はアプリケーション内でメモリ割り当てコード( 'malloc'、' free'など)へのすべての呼び出しを再定義しました。ノードがメモリを割り当てるとき、オフセットはこの 'std :: map'オブジェクトに記録されます。 'Slave'が地図を更新しようとすると(送信後)、それは失敗します。 – sholsapp

+0

それは私が言っていることです。記録*どこに*? –

答えて

3

あなたの特定の質問に答えるために:

んC++を対象にしてインスタンス化されたことをメモリの領域の外にオブジェクトの状態のいくつかの並べ替えを維持しますか?

答えはノーです。オブジェクトを「追跡」するように設定された他のデータ構造やソートの何もありません。 C++は明示的なメモリ割り当てモデルを使用しているため、割り当てと割り当て解除の責任を負うことを選択した場合、完全な制御ができます。

あなたのコードに何か間違いがあると思われますが、コードが正しいと思うので、あなたのコードが失敗している可能性がある他の理由を発明しています。私は取り戻し、あなたのコードが現在どのように働いているかについて慎重に調べ、問題を特定できるかどうかを確認します。STLクラスは複雑ですが(特にstd::map)、最終的にはコードであり、隠された魔法はありません。

関連する問題