12

malloc()s とs をランダムにネストして異なるサイズで使用するfree()と、ある時点でメモリが断片化されます。これは、これらの操作により、連続していない小さなメモリ領域の大きなリストが残るため、1 つの大きなピースとして割り当てることができないためです。 .

これに関するいくつかの質問:

  • これが非常に頻繁に行われ、メモリが強制的に断片化され、これらのメモリ領域がすべてfree()削除される場合、これらの空き領域が元の連続したサイズに連結されていると想定できますか?

  • 同じメモリに対して常にmalloc()後続の呼び出しを実行free()し、これらの呼び出しをネストしない場合、割り当て/解放されたサイズが常に異なる場合、このシナリオでもメモリが断片化されますか?

4

2 に答える 2

5

いいえ、保証はありません。N1570 によると、7.22.3 メモリ管理機能:

aligned_alloc、calloc、malloc、および realloc 関数への連続した呼び出しによって割り当てられるストレージの順序と連続性は規定されていません。

とにかく、次の 2 つの選択肢があります。

  1. ライブラリのメモリ管理機能を完全に信頼します。
  2. 本当に自信がある場合は、独自のメモリマネージャーを作成してください。

もし私があなたなら、間違いなく既存の関数を信頼するでしょう。最新の実装は非常にスマートだからです。

于 2016-05-12T12:27:39.757 に答える
3

ISO / IEC 9899:201x -> 7.22.3 に準拠

aligned_alloc、calloc、malloc、および realloc 関数への連続した呼び出しによって割り当てられるストレージの順序と連続性は規定されていません。

優れたメモリ マネージャーは、この問題にある程度取り組むことができます。ただし、内部の断片化を引き起こすデータ配置[1]のような他の側面があります。

組み込みのメモリ管理に依存している場合、何ができるでしょうか?

  1. プロファイラー (valgrind など) をメモリ チェック オプション付きで使用して、使用後に解放されないメモリを見つけます。例:

     valgrind --leak-check=yes myprog arg1 arg2
    
  2. グッドプラクティスに従ってください。例 - C++ では、他の人にポリモーフィック クラスを継承させる場合、そのデストラクタを仮想として宣言できます。

  3. スマート ポインターを使用します。

ノート:

  1. 内部断片化

  2. 独自のメモリ管理システムを使用する場合は、Boehm-Demers-Weiserガベージ コレクターを検討してください。

  3. Valgrindインストルメンテーション フレームワーク。

  4. 使用後に解放されないメモリは、断片化の原因になります。
于 2016-05-12T12:39:42.903 に答える