2009-09-08 12 views
2

こんにちは私はIPCが必要なアプリケーションを持っています...私は名前付きパイプは使い方が簡単だから行く方法だと思っています。ダイナミックメモリを使用した名前付きパイプ方式

とにかく、名前付きパイプを使用してダイナミックメモリを処理する方法に関する質問があります。

は、私がこのようなクラスを持っていると言う:私はパイプを介してそれらを送信後、MyTestClassオブジェクトの完全なバッファを作成するときに

class MyTestClass { 
public: 
    MyTestClass() { _data = new int(4); } 

    int GetData() { return *_data; } 
    int GetData2() { return _data2; } 

private: 
    int* _data; 
    int _data2; 
}; 

は今、私は明らかに先の工程で_dataを失い、ごみを取得しています。私はこれを使うべき戦略がありますか?単純なケースでは値型を使用できますが、多くの複雑なクラスでは何らかの動的メモリを使用する必要があり、ポインタが好きです。

代わりに、代わりに共有メモリを使用するといいですか?ありがとう

+0

あなたは '_data2'とその他のものを削除するべきだと思います。それは完全ではありません(初期化)と私はあなたの質問はとにかくそれなしではっきりと思う。 – GManNickG

+0

コンストラクタはメモリを割り当てているので、そのメモリを解放するにはデストラクタが必要ですね。 –

+0

はい私は...私はちょうど応答を – Polaris878

答えて

3

名前付きパイプと共有メモリの両方に同様の問題があります。送信側の構造にシリアル化し、受信側の構造を逆シリアル化する必要があります。

シリアル化プロセスは、名前付きパイプまたは共有メモリを使用しているかどうかにかかわらず、基本的に同じです。埋め込みポインタ(_dataや_data2のような)の場合、ポインタの内容を一貫してシリアライズする必要があります。

構造体がメモリにどのようにレイアウトされ、IPCが効率的であるかによって、使用できるシリアライゼーション戦略がたくさんあります。あるいは、DCE RPCを使用してRPCマーシャリングコードで複雑さを処理することもできます。

+0

おかげで全体のポイントを取得したい...悪い形のため、申し訳ありません、それを解放するために、私が使用できるプロトコルや、私が使用できるシリアル化戦略上の任意のヒントが必要なのでしょうか?ありがとう – Polaris878

+0

シリアライゼーション戦略を探しているなら、最も一般的なケースはファイルストレージです。どのようにあなたのクラスをファイルに書き込んで、後でそれを読み返しますか? IPCチャンネルを 'std :: streambuf'としてラップすると、多くの作業を省くことができます。そうすれば、多くのコードを共有して再利用することができます。 – MSalters

+0

MSaltersは私の口から正しい言葉を取り出しました。彼の提案は注目されています。 –

1

名前付きパイプでデータを送信するには、送信側のデータをシリアル化(またはマーシャリング)し、受信側でデータを逆シリアル化(または非整列化)する必要があります。

データ構造にバイトのコピーを単に書き込んでいるかのように、疑わしいように聞こえます。これはまったく良いことではありません。割り当てられたデータはコピーされません(データ構造の最初と最後のバイトの間には格納されませんが、それ以外の場所には格納されません)、あるマシン(またはプロセス)から別のマシンローカルプロセス内のメモリアドレスは、他のものでは保証された意味を持ちません。

ワイヤで送信するデータのレイアウトを定義するワイヤプロトコル(必然的であれば、第2の考えでは、第2の考えでは、それは厄介なものではありません)を定義します。次に、送信側と受信側(または、seralizerとdeserializer)の機能を実装します。あるいは、すでにこれを行う他人のコードを見つけてください。

エンディアンを処理することも忘れないでください。名前付きパイプを通じてバイトが送信される順序を定義する必要があります。

たとえば、送信されるメッセージが、ネットワークバイトオーダーの4バイトの符号なし整数で構成され、その後に続く構造体の数を定義する4つの符号付き4バイト整数のシーケンス_data2の単一符号付き4バイト整数(ネットワークバイトオーダーでも送信されます)。

名前付きパイプのIPCメカニズムとしての選択は、ほとんど重要ではないことに注意してください。共有メモリ(本来同じマシン上)を使用している場合を除き、エンディアンを処理しなければならず、共有メモリであっても直列化に対処する必要があります。

+0

ありがとうございました...それは私が考えていたことです...私はIPCのものに少し新しいです。今、私はちょうどハハを介して生のバイトを送信していた...私はこれらのIPCメカニズムの限界が何であるかを見たいと思っていました。データ構造に含まれていないバイトについて100%正しいです...それはまさに私が解決しようとしていた問題です。 – Polaris878

関連する問題