2016-04-30 21 views
0

私はの形をとる構造体の静的配列でメモリ・ブロックをシミュレートしていますプロセスからメモリサイズを取得し、isAllocatedを1に設定し、PIDを要求プロセスのプロセスIDに変更することによって占有されているアレイの一部をマーキングする。メモリ割り当て解除シミュレーション問題

ここで、isAllocatedを0に、PIDを0に設定してこの配列から「メモリ」を割り当て解除するfreeのような関数を書きたいと思いますが、どうすればよいでしょうか?概念的には、この配列のインデックス0から始める必要があり、最初のインデックス(isAllocated = 1とゼロ以外のPIDの権利)をチェックする必要があることはわかっていますか? 私はすでにこれは、これまで実施しています:

void* custom_free(void* ptr, unsigned int size) 
{ 
    unsigned int blockIndex = 0, sizeCount = 0, startIndex = 0; 
    if(ptr){ free(ptr); } 
} 

編集:私はこのようなmemBlock構造のためのmallocコールを持っている私のコードで以前:

memBlock *block = (memBlock *)malloc(BLOCK_SIZE);

BLOCK_SIZEが一定で定義されたプリプロセッサです

+0

@WhiZTiM 'memBlock'構造体に示されているような構造体メンバのインライン初期化はC言語ではできませんが、C++で行われるため、C++タグの削除は時期尚早でした。 –

+0

これはCではなくC++です。 C++の 'new' /' delete'演算子を使うべきです。 Cタグを削除します。 – Olaf

+0

あなたは私のコメントを理解していないかもしれません。繰り返します:**これはCコードではありませんが、C++ ** CとC++は異なる言語であり、正しいタグを使用する必要があります。 – Olaf

答えて

1

アロケータによって割り当てられたメモリブロックに関する情報を格納する一般的な方法は、それが割り当てるメモリブロックに情報構造体を格納することです。

sizeバイトを割り当てるのではなく、size + sizeof(memBlock)バイトを割り当て、ポインタをmemBlock構造体へのポインタとして使用し、必要な情報を入力します。次に、memBlock構造の後のメモリへのポインタを返します(つまり、&((memBlock *) ptr)[1]のようなもの)。

memBlock構造体のサイズを減算すると、memBlock構造体を指す元のポインタが得られます。

もちろん、isAllocatedのようなメンバーはかなり役に立たなくなります。独自のブロックがあり、そのブロックの倍数だけを割り当てる場合は、どのブロックが割り当てられたかに関する情報とブロック数も格納する必要があります。

+0

これは意味がありますが、なぜ具体的にisAllocatedは役に立たないのですか? 'isAllocated'を使う以外に、占領されたブロックと空のブロックを区別するにはどうすればいいですか? – user02103012