問題タブ [stack-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ヒープ上に静的配列を作成しますか?
非常に大きな配列を作成する必要があります。50メガバイトとしましょう。
通常の静的配列として安全に作成できますか? コンパイラはそれをスタックに配置しますか (スタック オーバーフローを引き起こす可能性があります)、それともヒープに配置するのに十分スマートでしょうか?
そうする方法がない場合、プログラムの開始時に malloc または "new" で実行し、プログラムの終了時に自動的に解放する簡単な方法はありますか?
c - C でのメモリ割り当て
メモリのどの部分にヒープ、スタックなどがあるかを調べるにはどうすればよいですか? 現在、C のプログラムを調べています。.elf ファイルを見ると、プログラムが使用しているメモリ アドレスを確認できますが、それがヒープにあるのかスタックにあるのかわかりません。
c - 文字列リテラルはメモリ内のどこにありますか? スタック/ヒープ?
重複の可能性:
C 文字列リテラル: どこに行くの?
私の知る限りでは、
一般に、ポインターは malloc() によって割り当てられる必要があり、ヒープに割り当てられ、次に free() によって割り当て解除されます。
と
非ポインター (int、char、float など) は自動的にスタックに割り当てられ、関数が戻るまでは割り当てられません。
しかし、次のコードから:
どこにa
割り当てられますか? スタックまたはヒープ?
c++ - 破壊されることなく関数からベクトルを返す
私は興味深い問題に遭遇しました。クラスで満たされたベクトルを返すC++の関数があります。ベクトルが返されると、ベクトルの要素である各クラスのデコンストラクターが呼び出されます。
問題は明らかです。クラスがポインタを指す場所でデータが破棄され、オブジェクトが破棄されるとポインタが解放されます。ベクトルがヒープ上ではなくスタック上にあるため、デコンストラクターが呼び出されると想定することしかできません。
したがって、問題は次のとおりです。
関数からベクトルを破棄せずに返し続ける方法はありますか?または、関数への入力としてベクトルを返すためにポインターを渡す必要がありますか?
winapi - App Verifier の出力の解釈: ヒープが破損しているか、スタック アドレスがヒープ アドレスと誤って解釈されていますか?
大規模な MFC ベースのアプリをヒープ破損エラーでクラッシュさせるテスト ケースがあります。
問題の DLL に対して App Verifier を使用してページ ヒープを有効にしました (プロセス全体でヒープを有効にすることは、残念ながら他の理由で実行できません)。元のクラッシュと同じ時点でトリガーされました。
現在、私は2つの競合する理論を持っています。どちらの理論が正しい可能性が高いと思いますか?次のステップは何ですか?
- これは確かにヒープの破損です。別の DLL で発生しているため、ベリファイアは元の損傷を検出していません。より多くの DLL に対してベリファイアをアクティブ化し、どのコードがヒープを損傷しているかを特定する必要があります。
- ヒープは問題ありません。問題は、スタック アドレスをヒープ アドレスとして扱っていることです。このコールスタックのコードをさらに調べて、何が問題なのかを突き止める必要があります。
free() へのパラメーターがスタック アドレスのように見えるため、私は #2 に傾いていますが、これがどのように可能であるかについて、これまでのところ誰も説明を提案していません。
コール スタックのスニペットを次に示します。MyString は、CString の単純なラッパーです。MyAppDll は、ページ ヒープを使用するように設定された DLL です。
free() スタック フレーム内のレジスタは次のとおりです。
アプリ検証メッセージは次のとおりです。
c++ - C++ 動的 vs スタック オブジェクトとその使用方法
私は常にヒープ上で動的に割り当てを行ってきました。私は普通の C と同様に多くの Objective-C プログラミングを行ってきました。通常は大量のメモリを扱うので、スタック オーバーフローを防ぐためにヒープ オブジェクトが必要です。
私は最近、C++ では動的に割り当てられたオブジェクトを使用することは推奨されておらず、可能な限りスタック オブジェクトを使用する必要があると言われました。どうしてこれなの?
これを説明する最良の方法は、例によるものだと思います。
これにより、2 つのオブジェクトが作成され、それらがポインターに格納され、main()
それぞれのメソッドが呼び出されます。Class
オブジェクトは を作成し、その中char*
に C 文字列を格納し"Hello!"
ます。~Class()
デアロケータはメモリを解放します。doSomething()
メソッドは を使用して出力し"buff: %s"
ますprintf()
。十分に単純です。それでは実行してみましょう:
ディロック
バフ: こんにちは!
バフ:¯ø_ˇ
おっと、どうしたの?C++_obj2
は、それへのポインターを格納したにもかかわらず、その割り当てを解除しました。これは、ヒープではなくスタック上にあり、C++ には Objective-C のようなリテイン カウント メカニズムがないためです (ある時点で実装を試みましたが、完全に機能しましたが、スーパークラスとしてすべてに追加する気がしませんでした)。したがって、関数が戻った後もそれを維持するために、フープをジャンプする必要があります。
c++ - スタック オブジェクトとヒープ オブジェクトの間で変換する方法
例:
これにより、2 つのオブジェクトが作成され、それらへのポインターが作成され、次に main() がそれぞれのメソッドを呼び出します。Class オブジェクトは char* を作成し、C 文字列 "Hello!" を格納します。初期化; ~Class() デアロケータはメモリを解放します。doSomething() メソッドは、printf() を使用して "buff: %s" を出力します。十分に単純です。これを実行すると、次のようになります。
ディロック
バフ: こんにちは!
バフ:¯ø_ˇ
明らかに、スタック オブジェクトはここでは機能しません。関数が終了するとき、ポインター _obj2 がスタック内の場所を指していることは明らかです。これが、以前の質問でヒープ オブジェクトを使用した理由です。人々は私に「ばかげている」と言っていました。
したがって、最初の質問は、create() の終了後に割り当てが解除されないように、スタック オブジェクト (obj2) をヒープ オブジェクトに変換するにはどうすればよいかということです。多くの人がそうしてきたように、傲慢な「あなたは間違ったことをしている」ではなく、率直な答えが欲しい. この場合、スタックオブジェクトは機能しないため、ヒープオブジェクトが唯一の方法のようです。編集: また、スタック オブジェクトに変換することも同様に役立ちます。
2 番目の質問: ヒープ オブジェクトが「間違っている」具体的な例は、演算子vector<string>*
を使用して新しいオブジェクトを作成することでした。STL オブジェクトの動的割り当てが間違っている場合、正しい方法は何ですか? それらをスタックオブジェクトとして作成すると、すぐに割り当てが解除されるため失敗することは明らかですが、それらを動的に割り当てるとヒープが破損する可能性があると(非常に高いランクのメンバーから)言われました。それで、それを行う正しい方法は何ですか?new
c++ - サブシステムの作成には動的割り当てまたは自動推奨ですか?
私は趣味のC++プログラマーであり、現在(Ogre3Dを使用して)ゲームに取り組んでいます。メインクラスのメモリ割り当てについて質問があります。
私はメモリ割り当て、スタックに自動的に割り当て、ヒープに動的に割り当てること、およびそれらの違い(パフォーマンス、制限されたスタックサイズ)について多くのことを読みました。それでも、メインクラス(Application)と他のいくつかの「factory」クラス(Applicationクラスの単一インスタンスによって作成された)に何を使用すればよいかわかりません。これらはすべて、実行全体を通して単一のインスタンスが存在します。
以下は、レイアウトの簡略化されたスニペットです。
スタックまたはヒープ(アプリケーションクラスとファクトリクラスの両方)にメモリを割り当てる方がよいですか?そして、どのような議論によって?
前もって感謝します!
c++ - C++ メモリ管理に関する基本的な質問
ふだんは記憶なんてどうでもいいcat1
のですが、はっきりと理解したいのですが、 と と はどのような記憶cat2
の中a
にb
存在するのでしょうか。スタックまたはヒープ内?
@BoPerson: そうです、私はb = new int(0)
. しかし、私にとってもっと興味深いのはa
、オブジェクトCat
がヒープに作成されたときに変数はどこにあるのでしょうか? a
ヒープにも?ヒープ内のポインタb
もヒープ内のメモリを指していますよね?
haskell - Haskell コンパイラは、ヒープとスタックのどちらに割り当てるかをどのように決定しますか?
Haskell は明示的なメモリ管理機能を備えておらず、すべてのオブジェクトが値渡しであるため、明らかな参照カウントやガベージ コレクションもありません。Haskell コンパイラは通常、特定の変数に対してスタックに割り当てるコードを生成するか、ヒープに割り当てるコードを生成するかをどのように決定しますか? 同じ関数の異なる呼び出しサイトに同じ変数を一貫してヒープまたはスタックに割り当てますか? また、メモリを割り当てるとき、いつメモリを解放するかをどのように決定しますか? スタックの割り当てと割り当て解除は、C と同じ関数の入口/出口パターンで引き続き実行されますか?