個人財務 ヒープがC ++でどのように動作するか - ダミー

ヒープがC ++でどのように動作するか - ダミー

目次:

ビデオ: What the heck is the event loop anyway? | Philip Roberts | JSConf EU 2025

ビデオ: What the heck is the event loop anyway? | Philip Roberts | JSConf EU 2025
Anonim

ヒープは、C ++プログラムが必要に応じてアクセスできるアモルファスメモリブロックです。それがなぜ存在し、どのように使用するのかについて学びます。

関数へのポインタを渡すことができるのと同じように、関数がポインタを返すことも可能です。 doubleのアドレスを返す関数は、次のように宣言されます。

double * fn(void);

しかし、ポインタを返すときは非常に注意する必要があります。その危険性を理解するためには、可変スコープについて何かを知る必要があります。

<! - 1 - >

C ++でのスコープの制限

スコープは、変数が定義される範囲です。次のコードスニペットを考えてみましょう:

//次の変数は//すべての関数からアクセス可能で、//プログラムが実行されている間は定義されています(グローバルスコープ)int intGlobal; //次の変数intChildは//関数にのみアクセスでき、// C ++がchild()を実行しているか、または//関数が呼び出す関数(function scope)void child(void){int int //; //次の変数intParentは関数//スコープvoid parent(void){int intParent = 0;子(); int intLater = 0; int(int nArgs、char * pArgs []){parent();}このプログラムフラグメントは、変数intGlobalの宣言で始まります。この変数は、プログラムが実行を開始して終了するまで存在します。あなたはintGlobalに "プログラムの範囲があると言います。また、main()関数が呼び出される前でも変数が「有効範囲に入る」と言っています。

<! - 2 - >

関数main()はすぐにparent()を呼び出します。プロセッサがparent()で最初に見えるのは、intParentの宣言です。その時点で、intParentはスコープに入ります。つまり、intParentは関数parent()の残りの部分で定義され、使用可能です。

parent()の2番目の文はchild()の呼び出しです。もう一度、関数child()は、ローカル変数、今回はintChildを宣言します。変数intChildのスコープは、関数child()に限定されています。技術的には、child()はintParentにアクセスできないため、int()のスコープ内でintParentが定義されていません。ただし、変数intParentは、child()が実行されている間は引き続き存在します。

<! - 3 - >

child()が終了すると、変数intChildがスコープから外れます。 intChildにアクセスできなくなるだけでなく、もはや存在しません。 (intChildが占有しているメモリは、他のものに使用されるように一般プールに返されます。)

parent()が実行を続けると、変数intLaterが宣言のスコープに入ります。 parent()がmain()に戻ると、intParentとintLaterの両方がスコープから外れます。

intGlobalはこの例ではグローバルに宣言されているため、3つの関数すべてで使用でき、プログラムの有効期間中も使用できます。

C ++でスコープの問題を調べる

次のコードセグメントはエラーなしでコンパイルされますが、うまくいきません(ちょっと嫌いなのですか?):

double * child(void){double dLocalVariable;戻り値&dLocalVariable;} void parent(void){double * pdLocal; pdLocal = child(); * pdLocal = 1. 0;}

この関数の問題は、dLocalVariableが関数child()のスコープ内でのみ定義されていることです。したがって、dLocalVariableのメモリアドレスがchild()から返されるまでには、もはや存在しない変数を参照します。 dLocalVariableが以前占有していたメモリはおそらく他のものに使用されています。

このエラーは非常に一般的です。なぜなら、さまざまな方法で這い上がる可能性があるからです。残念ながら、このエラーはプログラムを即座に停止させることはありません。実際、プログラムはほとんどの場合正常に動作します。つまり、dLocalVariableが占有していたメモリが直ちに再利用されない限り、プログラムは動作し続けます。このような間欠的な問題は解決するのが最も難しい問題です。

C ++でヒープを使用したソリューションの提供

スコープの問題は、C ++がプログラマの準備が整う前にローカルで定義されたメモリを取り戻したために発生しました。必要とされるのは、プログラマによって制御されるメモリのブロックである。 C + +はそれが良いアイデアだと思っているわけではないので、彼女は思い出を割り振り、それを元に戻すことができます。このようなメモリブロックはヒープと呼ばれます。

ヒープ・メモリーは、新しいキーワードの後に​​割り振るオブジェクトのタイプを使用して割り振られます。新しいコマンドは、指定されたタイプのオブジェクトを保持するのに十分な大きさのヒープをメモリから切り離し、そのアドレスを返します。たとえば、次の例では、ヒープからdouble変数を割り当てます。

double * child(void){double * pdLocalVariable = new double; return pdLocalVariable;}

この関数は正しく動作するようになりました。関数child()が戻ったときに変数pdLocalVariableが有効範囲外になりますが、pdLocalVariableが参照するメモリは参照しません。

void parent(void){// child()はアドレスを返します。delete()メソッドは、ヒープに明示的に返されるまで、ブロックのヒープメモリーの二倍* pdMyDouble = child(); //そこに値を格納する* pdMyDouble = 1. 1; // … //ヒープにメモリを返すdelete pdMyDouble; pdMyDouble = 0; // …}

ここでchild()によって返されたポインタは、double値を格納するために使用されます。機能がメモリ位置で終了した後、ヒープに戻ります。関数parent()は、ヒープメモリが返された後にポインタを0に設定します。これは必須ではありませんが、とても良いアイデアです。

プログラマーが削除後に* pdMyDoubleに何かを誤って保存しようとすると、プログラムはすぐに意味のあるエラーメッセージでクラッシュします。

- >

newを使用してヒープから配列を割り当てることもできますが、delete []キーワードを使用して配列を返す必要があります:

int * nArray = new int [10]; nArray [0] = 0; delete [] nArray;

技術的に新しいint [10]は新しい[]演算子を呼び出しますが、新しいものと同じように動作します。
ヒープがC ++でどのように動作するか - ダミー

エディタの選択

オンラインデートジレンマ:ディッシングアウト拒否 - ダミー

オンラインデートジレンマ:ディッシングアウト拒否 - ダミー

インターネットは奇妙な場所で、個人的な経験はインターネット上で完全に共通しています。その言葉は一般的なものであり、丁寧でも丁寧でもないことに注意してください。適切な方法で拒否を排除する方法を知る必要があります。あなたは本当の人生と同じように、すばやくそれをする必要があります。

ダミー

ダミー

多くのオンラインデートサイトでは、タグラインと呼ばれるフレーズを表示できます。マッチのようなサイトもあります。 Comでは、長い画面名と長いタグラインを選択できます。しかし、そのオプションはちょっと圧倒されるかもしれませんので、比較的短い名前で、あなたの創造的なジュースに焦点を当てます...

多くのコーヒーは二番目の日付がないので? - 50年後のダミー

多くのコーヒーは二番目の日付がないので? - 50年後のダミー

は、始動のトラブルなど多くの課題を提示することがあります。コーヒーを飲んで最初のミーティングが不足しているにもかかわらず、そこでの関係が終わった場合は、終了する気がするかもしれませんが、そうしないでください。手がかりを探す3つの場所は次のとおりです。写真やプロフィールであなた自身を虚偽表現しましたか?あなたの写真は... ...

エディタの選択

霊的実現の多面体 - ダミー

霊的実現の多面体 - ダミー

世界の偉大な神秘家の物語を読んだらあなたは霊的な経験が驚異的な形と大きさの配列に入っていることが分かります。例:一部のアメリカ先住民のシャーマンは、部族メンバーの同盟国やその他の治癒のためのリソースを見つけるために、他の次元に旅する改造国に入る。ヒンズー教徒の一部...

心を練習する感謝の気持ちを育む - ダミー

心を練習する感謝の気持ちを育む - ダミー

あなたが気づいたら感謝しますあなたがしているものではなく、あなたが持っているもの。思いやりが感謝の出発点です。マインドフルさがなければ、あなたの人生でうまくいっているすべての事柄を認識することはできません。したがって、感謝の気持ちのある人は気をつけている人です。

レギュラー・メディテーション・プラクティスの作成方法 - ダミー

レギュラー・メディテーション・プラクティスの作成方法 - ダミー

あなたは毎日できる瞑想の練習をすることができます。簡単にしておいてください。結局のところ、瞑想のポイントは、あなたの体をリラックスさせ、あなたの忙しい心を和らげ、あなたの人生をより複雑にすることではありません。ここには...

エディタの選択

ミノーニクス - ダミーを使ったミラー類推テストの語彙を学ぶ

ミノーニクス - ダミーを使ったミラー類推テストの語彙を学ぶ

ミラー類推テスト(MAT)さまざまな科目に関する知識が必要です。また、語彙を増やすことは、MATの成功の鍵です。ニーモニックは、膨大な語彙をマスターするための強力なツールです。

のLO QU​​Eのデベ・トラアー - Yなしtraer-らセントロデPruebasデGED

のLO QU​​Eのデベ・トラアー - Yなしtraer-らセントロデPruebasデGED

アンティデSalirデSUカーサパラIRらセントロデpruebasデGED EL DIAデルexamen、asegúreseデtraer CON usted UNO POCOSartículosimportantes(コモSUidentificaciónCONfotografía) - Y dejarエンカーサalgunos otras cosas(コモ国連bocadilloパラ・ラ・メディアMananaのOウナcalculadoraデアルタtecnología)QUE ...

あなたのGREを噛み砕くためにあなたができることを想像する - ダミー

あなたのGREを噛み砕くためにあなたができることを想像する - ダミー

GRE試験を完全に吹き飛ばすために人々がする狂気のことを考えてみましょう。これらの災害に気付くことで、災害があなたのテスト体験に影響するのを防ぐことができます。集中力を失うあなたは、退屈な退屈な読書理解の途中にいるときに、最悪のことをすることができます...