問題タブ [free]
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++ - delete []の代わりにfree()またはdeleteを呼び出すことに危険はありますか?
delete
配列の最初の要素を超えて要素の割り当てを解除しますか?
上記の場合、のすべての要素が連続して割り当てられていることを確認することは重要であり、配列の一部のみs
に割り当てられるべきではありませんか?delete
より複雑なタイプの場合delete
、最初のオブジェクトを超えてオブジェクトのデストラクタを呼び出しますか?
最初の数を超えるsの数をどのようdelete[]
に推測できObject
ますか?これは、割り当てられたメモリ領域のサイズを認識している必要があるという意味ではありませんか?パフォーマンス上の理由でメモリ領域にオーバーハングが割り当てられた場合はどうなりますか?たとえば、すべてのアロケータが1バイトの粒度を提供するわけではないと想定できます。その場合、特定の割り当ては、要素全体またはそれ以上、各要素に必要なサイズを超える可能性があります。
、などのプリミティブ型の場合、次の間にchar
違いint
はありますか。
delete
->free
割り当て解除機構を介してそれぞれの呼び出しがたどるルートを除いて?
c++ - delete で解放されたオブジェクトのデストラクタ内で free を使用する
delete で解放しているオブジェクトがありchar*
、そのデストラクタに free で解放されている があります。free を使用する理由は、strdup を使用malloc
してポインターを作成したためchar
です。私が使用してmalloc
いる理由は、ほとんどのコード パスで最初に strdup を使用したためです。このシナリオはメモリの破損を引き起こしますか?
c - c malloc の質問 (メモリ破損)
malloc を使用しているときに、次のエラーでコア ダンプが生成される場合:
これは、malloc が自由に割り当てられないメモリを割り当てようとしたことを意味しますか? もしそうなら、これの原因は何ですか?
c - C: 多次元配列のメモリを正しく解放する
多次元配列を初期化する次の ANSI C コードがあるとします。
を使用した後**a
、メモリから正しく解放するにはどうすればよいですか?
【追記】(解決)
ティム (および他の人) の回答のおかげで、多次元配列からメモリを解放する関数を実行できるようになりました。
c++ - malloc()とfree()の後に一部のメモリが割り当てられたままになっているようです
私はCを初めて使用します。malloc+無料に慣れようとしています。次のテストをコーディングしましたが、何らかの理由でメモリが完全に解放されていません(上部にはまだ約150MBのメモリが処理に割り当てられていることが示されています)。何故ですか?
対応するMakefile:
c++ - 「破損した二重リンク リスト」エラーの原因は何ですか?
かなり複雑なコードで問題が発生しています。エラーを再現する短いスニペットを作成できなかったので、問題を言葉で説明しようと思います。
エラーでコードがランダムにクラッシュする
デバッグは、コードがオブジェクトを解放する行からのものであることを示しました。オブジェクトに問題はないようです。存在し、エラーが発生した時点でそのデータにアクセスできます。オブジェクトのデストラクタは自明で、何もしません。
だから、私はちょっと立ち往生しています。「無料」はどのような状況で失敗すると予想されますか?
c - ポインターを解放した後、ポインターを本当に `NULL` に設定する必要がありますか?
NULL
それらを解放した後にポインタを設定する必要がある理由は2つあるようです。
ポインターを二重に解放するときのクラッシュを回避します。
短い: に設定されている場合、誤って 2 回目の呼び出しfree()
を行ってもクラッシュしませんNULL
。
もう一度呼び出す理由がないため、ほとんどの場合、これは論理的なバグを覆い隠します
free()
。アプリケーションをクラッシュさせて修正できるようにする方が安全です。新しいメモリが同じアドレスに割り当てられる場合があるため、クラッシュする保証はありません。
二重解放は、ほとんどの場合、同じアドレスを指す 2 つのポインターがある場合に発生します。
論理エラーもデータの破損につながる可能性があります。
解放されたポインターの再利用を避ける
malloc()
短い:が同じ場所にメモリを割り当てると、解放されたポインターにアクセスすると、解放されたポインターがNULL
NULL
オフセットが十分に大きい場合 (someStruct->lastMember
, )、ポインターにアクセスするときにプログラムがクラッシュするという保証はありませんtheArray[someBigNumber]
。クラッシュする代わりに、データが破損します。ポインターを に設定して
NULL
も、同じポインター値を持つ別のポインターを持つという問題は解決できません。
質問
これは、解放後にやみくもにポインターを設定することに対する投稿NULL
です。
- デバッグが難しいのはどれですか?
- 両方キャッチできる可能性はありますか?
- そのようなバグがクラッシュではなくデータの破損につながる可能性はどれくらいありますか?
この質問を自由に展開してください。
c - free と malloc は C でどのように機能しますか?
たとえば、「途中から」ポインターを解放しようとするとどうなるかを理解しようとしています。次のコードを見てください。
Unhandled exception エラー メッセージでクラッシュします。free がなぜ、どのように機能するのかを理解したいので、使い方だけでなく、奇妙なエラーや例外を理解し、コードをより適切にデバッグできるようになります。
どうもありがとう