2016-10-25 9 views
-4

struct(Type)と関数があり、共有メモリ(shm_openとmmap)を介してstructを操作できるようになりました。ポインタがnullの場合、共有メモリの内容をnullにします。C++

Type* type = openSharedMemory(); 

私が作成したがopenSharedMemoryメモリではないプロセスにtrueを返す必要があり、共有メモリヌルと声明typeptr == nullptr場合、コンテンツを作りたいです。 可能ですか?新しい持つ場合、私は(ALOCATEていなかったので、

+2

またはC++ 11 type = nullptrです。スマートなポインターはさらに良いでしょう。そこに '.reset()'を呼び出すこともできます。 – Hayt

+0

@KlasLindbäckそれは効果がありません。この場合、タイプ== NULLはfalseです。 – Padmelina

+2

@Haytここでスマートなポインタが必要であることはまったくわかりません。 – juanchopanza

答えて

1

これはポインタの仕組みではありません。

ポインタをnullに設定すると、メモリは誰かが変更するまでそこに残ります。たとえメモリに0があるとしても、これは例えば整数0を意味することもあります。これは、C++の通常のポインタだけでなく、共有メモリの場合も同様です。

あなたがする必要があるのは、メモリを「無効」にすることです。これをC++で行う標準はありませんので、これはあなた自身で定義する必要があります。

ここにはいくつかのオプションがあります。


1つは、自分自身に無効な値を定義し、この値にデータを設定することです。

など。 intを持っていても、そこに正の数値だけが格納されていることがわかっている場合は、-1に設定して無効(または最大/最小のint、私はあなたがポイントを取得したものとします)とマークできます。

そして、それは

struct Type 
{ 
    bool valid = true; //c++11 initialize to true 
    //other data members 
}; 
有効であるかどうか、あなたがboolean型のフラグを追加することができ、あなたの記憶のカスタム構造体を持っているなら、あなたは代わりにポインタ

//in some header 
static const int INVALID_VALUE = -1; 

//some process 
type->shared_int = INVALID_VALUE; 

//somewhere else 
if(type->shared_int != INVALID_VALUE) //or whatever 
    //do stuff 

のことをご確認ください

ここで、メモリを無効にする場合は、メンバをfalseに設定してチェックしてください。

//some process 
type->valid = false; 

//somewhere else 
if(type->valid) 
    //do stuff 

あなたがオブジェクトの明確な所有権を持っている場合は、通常のポインタを使用しているとき、あなたはそれらの事を避けることができます。

少し複雑になる可能性があるプロセス間通信では、このようなメカニズムを使用する必要があります。

メモリ(割り当てと割り当て解除)を担当するプロセスを1つ持ち、他のプロセスが完了したことを確認するか、削除するときにメモリにアクセスする必要がなくなるようにすることをお勧めします。しかし、これはいつも可能ではありません。

+0

ありがとう、私はそれが私の問題を解決するものです。 – Padmelina

1

私は間違っていない場合、それは無用だが

単に役に立たないが、非常に可能性未定義の動作ではありません)(typeptr)を削除します。あなたが運が良ければ、プログラムはクラッシュします。

typeptrをnullptrにすることはできますか?

はい。

typeptr = nullptr; 

それは私が共有メモリを作成するのと同じプロセスでのみ動作します:あなたは値を割り当てることができます。

各プロセスには、typeptrのようなオブジェクトが存在する独自のメモリがあります。他のプロセスはこれらのオブジェクトにアクセスできません。あるポインタをnullに設定しても、他のポインタには影響しません。

実際に、nullを設定するポインタが共有メモリを作成したプロセスにある場合、そのプロセスだけがポインタにアクセスできるため、そのプロセスは値を設定する必要があります。ポインタ自体が別の共有メモリブロックでは、私はそうではないと仮定します。

私は共有メモリヌル

ああ場合は、コンテンツを作りたい、nullに尖ったコンテンツを設定すると、ポインタはnullを設定することとは全く異なるものです。 std::memsetを使用して、共有メモリをすべてゼロに設定できます。あなたが共有されていないメモリと同じように。

+0

これは、共有メモリを作成する同じプロセスでのみ機能します。私はまた、このメモリをopenSharedMemoryでチェックする必要があります。 – Padmelina

+0

@Padmelina:それはポインタの仕組みではありません。 –

+0

@ user2079303だから、私は共有メモリのデータで動作させることができるだけで、別の指針を持っていますか? openSharedMemoryプロセスでプロセスを作成する際にポインタをnullにすると、すべてのデータが0になるだけです。 – Padmelina

関連する問題