2011-12-27 8 views
0

Windows用のメモリマネージャをC++で作成しています。私はメモリを割り当てて、それをvoid *としてクライアントに戻すクラスを作成しました。私は新しいと削除演算子をオーバーライドして私のアロケータを使用しました。メモリマップを使用して割り当てられたメモリを渡す

__forceinline void * operator new(size_t n) 
{ 
    EnterCriticalSection(&CriticalSection); 
    void *ret = Heap.Alloc(n); 
    LeaveCriticalSection(&CriticalSection); 
    return ret; 
} 

いくつかのスレッドは、ある量のメモリを要求するアロケータプロセスになります。プロセス間でメモリを渡すことができるように、メモリマップなどを使ってこの割り当てられたメモリを渡す可能性はありますか?そこに割り当てられたメモリを使用するためにvoid *を別のプロセスに渡す方法はありますか?

答えて

1

void*を渡すことはできません。各プロセスには独自のアドレス空間があり、一方のアドレスには意味がありません。 Have a look at this question、あなたの必要を満たすようです。

1

メモリマップを使用することは、プロセス間でメモリブロックを共有する正しい方法です。 CreateFileMapping()MapViewOfFile()の機能を見てください。 CreateFileMapping()を呼び出すときに両方のプロセスが指定するメモリマップに一意の名前を付けます。

void*ポインタ自体をプロセス間で渡すことはできません。ポインタは、呼び出し元プロセスのアドレス空間に対してローカルです。異なるプロセスにはそれぞれ独自のアドレス空間があります。しかし、void*がメモリマップによって裏付けされている場合、両方のプロセスは、同じ名前のメモリマップに自身のローカルvoid*ポインタをマッピングすることによって共有メモリにアクセスできます。必要に応じて、そのメモリ内のプロセス間でオフセットを渡すことができます。また、それらのオフセットをローカルポインタに適用して同じデータにアクセスすることもできます。

関連する問題