1

私は誰かがすでにこのようなものを実装しているに違いないと確信しています! 私が探しているのは、ヒープ状態を「チェックポイント」し、最後のチェックポイント以降に発生したすべての割り当てをクリアする機能です。基本的に私が探しているのは、_CrtMemCheck Api の自然な結果です。

のようなもの(できればクロスプラットフォーム)

//we save the heap state here in s1
_CrtMemCheckpoint( &s1 );

//allocs and frees

//Get rid of all allocs since checkpoint s1 that have not been freed!
_CrtMemClearAllObjectsSince(&s1);
4

3 に答える 3

0

mallocC でメモリ割り当てのマーク/free calls will be used in a LIFO fashion, you may be able to link in your ownリリースを使用する標準的な方法はありません/

#define MY_HEAP_SIZE 12345678
unsigned char my_mem[MY_HEAP_SIZE];
unsigned char *my_alloc_ptr = my_mem;

void *malloc(size_t size)
{
  void *ret = my_alloc_ptr;
  if (size <= MY_HEAP_SIZE && ((my_alloc_ptr - my_mem)+size) <= MY_HEAP_SIZE)
  {
    my_alloc_ptr += size;
    return (void*)ret;
  }
  else
    return (void*)0;
}

void free(void *ptr)
{
  if (ptr)
    my_alloc_ptr = ptr;
}

このアプローチでは、割り当てブロックごとにゼロバイトのオーバーヘッドが必要ですがfree()、任意のブロックを呼び出すと、後で割り当てられたすべてのブロックも解放されます。malloc/free外部コードがLIFO 順序で使用されない場合に使用できる代替アプローチですが、コードが解放されるまでブロックが解放されなくfree()ても問題ありません。上記のようfreeに。より洗練されたバリエーションも可能ですが、最初のアプローチで十分な場合は、その効率に勝るものはありません。組み込みシステムには非常に便利です (ただし、通常は malloc 以外の名前で呼びます)。

于 2012-04-20T16:32:50.430 に答える
0

フックを使用して malloc()/free() を変更し、割り当てられたメモリを記憶することができます (たとえば、ポインターの配列に新しいポインターを記録するとします)。次に、次の 2 つの関数を使用できます。

  • int get_checkpoint()、次の空いている配列インデックスを返します。
  • void free_until(int checkpoint)checkpointに到達するまで、配列に現在格納されているポインターから逆方向にメモリを解放します。

このようにして、次のことができます。

int cpoint = get_checkpoint();
LibraryDoSomething();
free_until(cpoint);

もちろん、この手法は依然として危険です。C ライブラリ関数を呼び出すと、簡単に影響を与えることができる副作用が生じる可能性があります。最良のアドバイスは、依然として Amardeep のアドバイスです。

于 2012-05-15T15:23:11.837 に答える
0

別の興味深い解決策として、LD_PRELOAD を使用することもできます。LD_PRELOAD のマニュアルページには、「これを使用して、他の共有ライブラリの関数を選択的にオーバーライドできます」と記載されているように。

したがって、必要なチェックを実装してから、デフォルトの malloc または free を呼び出すことができる、独自の malloc および free の実装を持つことができます。

詳細はこちらで確認できます: http://somethingswhichidintknow.blogspot.com/2009/10/dll-injection.html

于 2013-03-30T07:56:20.320 に答える