2012-04-19 9 views
1

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

何か

//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); 
+0

をおそらく配列またはそれはということです?あなたは避けようとしていますか? – byrondrossos

+1

問題私はメモリがリークしているため、メモリの断片化を引き起こし、最終的にはメモリ不足の状態になっているサードパーティのライブラリを使用しています。しかし、いいニュースは私がリンクを制御することです。 :)私は私のカスタムmalloc/freeと最終的なフリー・アソシエイツをリンクするには、ある程度の時間が必要です。 :) –

+2

私は1)それを修正するために図書館の所有者のために押すだろう。2)そのサードパーティのライブラリをメインコードとは別の実行可能ファイルに入れ、そのプロセスを定期的に停止して再起動してください。 3)単一のプロセスOSであれば、より良いライブラリを見つけることができます。 –

答えて

0

あなたは事実をすべてmalloc/free calls will be used in a LIFO fashion, you may be able to link in your ownそのmalloc関数/ free`機能を知っている場合C.でマーク/リリースメモリ割り当てを使用する標準的な方法はありませんすべてのブロックのwその自由もなります

#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()を呼び出して、次のようなものを使用して後で割り当てられる。外部コードがLIFO順序でmalloc/freeを使用しない場合に使用できる代替アプローチですが、コードがそうするまでブロックが解放されない場合は、free()は何もしませんが、他の機能上記のfreeのように動作します。より洗練されたバリエーションも可能ですが、最初のアプローチで十分であれば、その効率を上回ることはありません。組み込みシステムには非常にいいです(私は通常、malloc以外のものと呼んでいます)。

0

hooksを使用してmalloc()/ free()を変更して、割り当てられたメモリを覚えておくことができます(たとえば、ポインタの配列内に新しいポインタを記録すると仮定します)。次に、あなたは2つの機能を持つことができます:

  • void free_until(int checkpoint)次のフリー配列のインデックスを返します

    • int get_checkpoint()を、後方配列に現在格納されているポインタからメモリを解放すること、checkpointに到達するまで。

    この方法で、あなたが行うことができます。もちろん

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

    を、この技術はまだ危険です。 Cライブラリ関数を呼び出すと、簡単に影響を与える可能性のある副作用が生じる可能性があります。最高のアドバイスはまだAmardeepのアドバイスです。

  • 0

    もう1つの可能な興味深い解決策は、LD_PRELOADの使用です。 LD_PRELOADのマニュアルページには、「これは他の共有ライブラリの関数を選択的に上書きするために使用できます。

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

    あなたがここで詳細を確認することができます、あなたがチェックポイントを設定し、その後、あなたはそれ以来のmallocから持っているポインタを追跡するために現在の時刻を格納することはできませんhttp://somethingswhichidintknow.blogspot.com/2009/10/dll-injection.html