2010-12-06 9 views
1

私はMS VS 2010、C++、unmanagedを使用しています。可能であれば、割り当てられた領域を分割したいと思います。たとえばのは、私がメモリに1キロバイトのスペースを割り当てたとしましょう:split malloc mem space

void* space = malloc(1024); 

後、私は別々512Bおよび512Bスペースとして、このブロックを持つことにしました:

space1 = 512B and space2 = 512B 

と最終的に私はを取り除きたいですこれらのスペースを私は別々に解放したいと考えています:

free(space1); 
free(space2); 

再割り当て/拡張/縮小メモリなしで可能ですか?

いいえ、あなたは(malloc関数として、個別にそれらを解放することはできません。..

答えて

1

すべてのいただきありがとうございます)が必要な簿記データのコピーを1つだけ保持しますので、それだけで自由に1つのチャンクをすることができます。独自のmalloc/freeラッパーを作成する必要があります。

+0

これは解決策があることを望みました。これはまあまあですが、私はメモリマネージャーを書き始めます。thnx。 – MCA

+0

@ MCAの場合、受け取った投票数の下にあるチェックマークを使用して、あなたが好む回答を受け入れることが慣習的です。 DeadMgの答えは、あなたが決めたものが即時のニーズを満たすものと思われるので、それを受け入れるべきです。 –

+0

ああ、申し訳ありません..私はこのウェブサイトでちょっと新しいです。私は答えを選ぶべきではないことに気付きませんでした.. – MCA

0

あなたはヒープのためのWindows APIを使用することができます。http://msdn.microsoft.com/en-us/library/aa366711(VS.85).aspx

HeapAlloc()mallocのと同じです。主な違いは、別のパラメータを受け取ることです:どのヒープを使用するか。これらのヒープはHeapCreateで作成することができ、そのためのスペースを予約することができます。

1

要約:malloc/newの上に独自のメモリアロケータを書く必要があります。

長いバージョン: メモリアロケータの実装が異なるため、割り当てられた空きブロック&の境界を追跡する内部データ構造を移植可能に変更する方法はありません。

たとえば、各メモリブロックに短い量のデータを前置する方法があります。このようなブロックを分割することはできません。これは、追加の簿記データがブロックのサイズを拡大するためです。

他の手法では、ビットマップ、リンクリストなどのように、ブロックから外部に管理データを配置します。あなたはそれらにもっと運があるかもしれません。

この場合も、独自のアロケータを作成する方がよいでしょう。

可能であれば、あなたのメモリを管理するための代替手段を探してみてください。たぶん、プールアロケータが必要なものであるかもしれません。

+1

プールが同じサイズのブロックやオブジェクトのコレクションでうまくいく –