2017-09-14 7 views
0

二つの静的メンバは、それがメモリプールの管理のために取られていますようにシステムを運用からSGI STLデフォルトアロケータにメモリリークがありますか? __default_alloc_templateの

static char* _S_start_free; 
static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS]; 

アロケータ照会ヒープ・スペースは、次のとおりです。

_S_start_free = (char*)malloc(__n); 

そして、それはこのヒープの建物の一部を使用します_S_free_listというフリーメモリリスト。

しかし、私は次のようにシステムを動作させるために戻ってメモリを与えるために任意のコードresbonsibleを見つけることができません。

free(_S_start_free); 

私は混乱しています。

  • システムのクリーニングによって異なりますか?
  • または、他の場所にクリーニングコードがありますか?

私を助けてください。

+0

プログラムの有効期間中ライブが行われる場合は、自分自身をクリーンアップする必要はありません。 – vu1p3n0x

+1

最新のオペレーティングシステムでは、プログラムは仮想メモリで実行されます。プログラムが終了すると、メモリマッピングが消えてしまいます。 –

答えて

0

最初の質問に対する回答はNOです!
SGIのSTLのデフォルトのアロケータ__default_alloc_templateはそれにそのメモリを解放しますが割り当て解除機能怒鳴るです:

/* __p may not be 0 */ 
static void deallocate(void* __p, size_t __n) { 
    if (__n > (size_t) _MAX_BYTES) 
     malloc_alloc::deallocate(__p, __n); 
    else { 
     _Obj* __STL_VOLATILE* __my_free_list 
      = _S_free_list + _S_freelist_index(__n); 
     _Obj* __q = (_Obj*)__p; 

     // acquire lock 
#  ifndef _NOTHREADS 
     /*REFERENCED*/ 
     _Lock __lock_instance; 
#  endif /* _NOTHREADS */ 
     __q -> _M_free_list_link = *__my_free_list; 
     *__my_free_list = __q; 
     // lock is released here 
    } 
} 

メモリブロックを解放するために必要な場合にはラガーで、その後_MAX_BYTES(128バイト、「大きなブロック」)この関数はmalloc_alloc :: deallocate(__ p、__n)を呼び出すだけで、malloc関数を呼び出してターゲットブロックを解放し、OSに戻します。さもなければ、それらの小さいブロックのためにメモリを返すのではなく、関数はそれらをメモリプールに戻します。

この問題は、スペースを頻繁に要求して解放するとメモリフラグメントが頻繁に発生するため、できるだけメモリフラグメントを削減するという考え方があります。

+0

あなたは精緻化できますか?内部構造を整理するのではなく、割り当てられたオブジェクトの割り当てを解除するのと同じように見えます。 – vu1p3n0x

+0

Vectorのようなコンテナは、_S_free_listによってリンクされたメモリを解放する役割を担います。メモリプールに関しては、プログラムが終了するときに取り戻されます。通常、シングルスレッドプロセスの環境では、メモリプールは小さな空間に制限されています。それはメモリプールの意味です。最後の人物です。 – RyanBao

+0

あなたの答えをありがとう。申し訳ありません。上記の私のあいまいな説明です。しかし、私が心配しているのは、メモリプールの終わりです。 – appleeated

関連する問題