スマートポインタのC ++スタティックメモリの使用状況に関する------対対の動的なヒープ・スタック

C ++メモリの概要

  ヒープ、スタック、フリー店、静的/グローバル記憶領域と定数記憶領域:C ++では、メモリは、5つの領域に分割されます。

  • スタティックメモリ:ローカル静的オブジェクト、クラス、静的データメンバを格納し、任意の関数(グローバル変数)の変数の外部を定義するために使用されるスタティックメモリ。
  • スタックメモリ:定義された関数内の非静的オブジェクトを保持するために使用されるスタックメモリ。
  • ヒープメモリ:メモリの新しいキーワードのオープンスペースがヒープメモリに配置されて使用して、プログラマがリリースしている(コンパイラによって責任があるではない)、削除するには、[削除]、新しい[]が対応する新しい一般的な対応[]、プログラマが解除されていない場合は、プログラムの最後に、システムが自動的にリソースを回復します。
  • 無料店舗:はい*自由空間内に配置されているのalloc割り当てられたメモリ空間は、リリースへの無料使用します
  • 一定のストレージ領域:特殊なストレージ領域、定数を保ち、それを変更することはできません。
      ヒープと空き容量が同じ領域に属する全メモリプール、新しい基本的な実装の呼び出しのmalloc関数、malloc関数の新しい高度なバージョンは、インテリジェントとして見ることができ、実際にあります。

スタック、ヒープVS

  ヒープメモリとスタックメモリは、2つの異なる領域のメモリであり、彼らは両方とも多くの点で異なる連絡先にあります。

  • 管理:
    • ヒープ制御プログラマへの資源のは、時として私たちはメモリリーク(メモリリーク)が発生することができ、メモリを解放するために忘れて、まだポインタ参照は、我々だけのメモリを入れて、時々データ記憶部を、それが有効な参照が生成されますメモリポインタ。
    • スタックリソースを手動で制御せずに、コンパイラによって自動的に管理しました。
  • システムの応答:
    • スタックスタックのため、システムは、システムが受信したときに、リンクリストをトラバースし、レコードポインタ空きメモリアドレスを持っている、アプリケーションプログラム、スタック領域を見つけるための最初のノードは、アプリケーションスペースよりも大きい場合、フリーリストからノードを削除し、プログラムに割り当てること。ヒープメモリのブロックの大きさが正確にアプリケーションスペースのサイズに等しい場合、最初のアドレスを直接ユーザに返され、要求されたサイズより大きいメモリブロックサイズ、ブロック分割、この場合、ヒープメモリの残りの部分は、使用可能なヒープメモリの残り「ヒープリンクリスト」と未割り当てに関連する他のメモリの形態です。ヒープメモリのブロックが全体のヒープリストのサイズを満たすために見つからない場合、システムは、その使用のために大きな面積を「ヒープリンクリスト」のリンクを提供します。このステップは、まだ失敗であれば、malloc関数はNULLを返し、プログラマーになりますエラー。
    • スタックは、限り、残りのスタック空間がアプリケーション空間よりも大きいように、システムは、プログラムのためのメモリを提供し、それ以外の場合は、スタックオーバーフローで例外を報告しました。
  • スペース
    • ヒープ:ヒープメモリ領域は、システムがリンクされたリストを格納するための空き領域を使用するため、ヒープサイズがスタック領域は比較的柔軟であるように、アクティブコンピュータシステムの仮想メモリ(32ビットシステム理論的4G)によって制限され、比較的大きい、連続的ではありません。
    • スタック:スタックは、連続したメモリ領域であり、所定の大きさは、コンパイル時定数で決定され、良好なオペレーティングシステムです。残りのスペースよりもアプリケーションのスタックスペースがオーバーフローするように指示されます。したがって、より少ないスペースがスタックから得られます。
  • 残骸
    • ヒープ:削除/新しい頻繁に使用するヒープは、破片の多くを引き起こすプログラムの効率が低下します。
    • スタック:スタックの場合、後者は、キューの先進出ている、との対応、無破片のうち。
  • 成長方向
    • スタック:スタックを上方上位アドレスに下から延長しました。
    • スタック:スタックは下向きに、下位アドレスに上位アドレスから延長しました。
  • 配分効率
    • ヒープ:動的に、新しい通常遅いと破片になりやすい、容易ではないために使用することにより、割り当てられたメモリによって割り当てられたヒープ。
    • スタック:スタックは、システムによって自動的に割り当てられ、動的に静的に割り当てられた割り当ての両方があります。より速く、しかし、プログラマが制御できません。

mallocとfree

malloc関数

  標準Cライブラリ関数の定義によれば、malloc関数は次のプロトタイプがあります。

void* malloc(size_t size);

この関数分布関数を達成するために、具体的に、システム内で利用可能なメモリの連続した期間です。

  • malloc関数はサイズパラメータで指定されたバイトの少なくとも数のメモリサイズを割り当てられました。
  • malloc関数の戻り値は、利用可能なメモリセクションの開始アドレスへのポインタです。
  • 特定のmalloc割り当てられたアドレスが解放されない限りはmalloc割り当てられたアドレスへの複数のコールは、重複してはなりません。
  • mallocのメモリ割り当てが可能と戻り次第として完成されなければならない(メモリ割り当てアルゴリズムを使用せずにNP困難です)。
  • malloc関数は、サイズ変更やメモリー機能の割り当て解除を達成するために達成すべき(のrealloc、無料)

自由

  フリー機能は、通話のmalloc、のcallocをリリースする前に使用され、割り当てられたメモリ空間をREALLOC、次のプロトタイプがあります。

void free(void *ptr);

  フリーな実装では、我々なければならない最初のアドレス二つの重要な問題がないことが、それほど単純では見ていません。

  • 入ってくるアドレスは、mallocの方法データ領域によって割り当てられた最初のアドレスであることが決定され、有効であることを確認する方法1.。第二に、実際にはmallocによって割り当てられたアドレスの前に、変更のmalloc、すなわち範囲first_blockポインタと現在のブレークで、領域を割り当てする前に、この問題を解決するために、最初のアドレスを決定します。
  • 2.どのように断片化の問題を解決します。

new和delete

  C ++では、動的メモリ管理部門は、オペレータの組によって達成されます。新しい:オブジェクトを返すためにオブジェクトを指し示すポインタを割り当てられた動的なメモリ空間に、我々はオブジェクトを初期化するように選択することができます。削除:、動的オブジェクト・ポインタを受け入れるオブジェクトを破棄し、それに関連付けられたメモリを解放します。
mallocと新しいの違い

  • malloc /無料の標準ライブラリの関数、C ++での新しい/削除の演算子。
  • malloc関数が空を返すことができなかった、新しい障害が例外をスローします。
  • 新しい/削除呼び出し、コンストラクタ、デストラクタ、malloc関数/自由ませんので、彼は動的オブジェクトの要件を満たすことができないものを。
  • これは新しいタイプ、mallocの戻り型なしポインタとポインタを返します。

スマートポインタ

  動的メモリを使用することが簡単かつ安全にするために、C ++標準ライブラリは、動的なオブジェクトを管理するために新しいスマートポインタ型を提供します。これは重要な違いは、それが自動的に参照されるオブジェクトを解放する責任があるということである、通常のポインタに似ています。スマートポインタは、クラスがスコープ外になるクラスであるため、クラスのデストラクタは自動的にデストラクタが自動的にリソースを解放します呼び出します。スマートポインタの原則の役割は自動的に手動でメモリ空間を解放することなく、関数の最後にメモリ領域を解放されるように。

  • shared_ptrのは、同じオブジェクトへの複数のポインタが、オブジェクトを繰り返し自体、関連するリソースが時に「最後の参照が撤回された」にリリースされることができます。それは()メンバ関数の数でリソースの所有者を表示はuse_count使用することができ、リソースは、いくつかのポインタを共有していることを示すために、計数機構を使用します。
  • unique_ptrを同じ時間にオブジェクトを指すことができる唯一のスマートポインタを確保、排他的な所有権を達成したり、厳格な考え方を持っています。リソースリークを避けるために特に有用な
  • weak_ptrを、それがshared_ptrの管理するオブジェクトを指し示す、ライフサイクルを制御しませんスマートポインタです。オブジェクトのメモリ管理が強参照のshared_ptrのあること、のweak_ptrは、管理対象オブジェクトへのアクセス手段を提供します。設計の目的は、shared_ptrの作業を支援するために導入され、それはどちらか一方のみのweak_ptrをshared_ptrのオブジェクトの構築から得ることができる、と彼の構造のデストラクタが、数の増減が発生することはありませんweak_ptrをshared_ptrのスマートポインタを合わせています。weak_ptrをshared_ptrのはの思考がお互い​​を参照するときに、2つのshared_ptrが相互に参照する場合、問題を解決するために使用され、2つのポインタの参照カウントが0に低下したことがない、リソースが解放されることはありません。
リリース7件のオリジナルの記事 ウォンの賞賛2 ビュー498

おすすめ

転載: blog.csdn.net/NewB20143864/article/details/104797261