問題タブ [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 - malloc/free ビーストを飼いならす -- ヒントとコツ
私は修士号を取得するためにいくつかのプロジェクトで C を使用してきましたが、それを使用して実稼働ソフトウェアを構築したことはありません。(.NET と Javascript は私のパンとバターです。) 明らかに、 C ではfree()
メモリの必要性malloc()
が重要です。1 つのルーチンで両方を実行できれば、これは問題ありません。しかし、プログラムが成長し、構造が深まるにつれて、何がどこで何が行われ、何が解放に適しているかを追跡することmalloc
はますます難しくなっています。
私はインターウェブを見回しましたが、これに関するいくつかの一般的な推奨事項しか見つかりませんでした. 私が疑うのは、長年の C コーダーの中には、このプロセスを単純化し、目の前の悪を維持するために独自のパターンとプラクティスを考え出した人がいるということです。
では、動的割り当てがメモリ リークにならないように C プログラムをどのように構築することをお勧めしますか?
c - C で const ポインターを解放できない
どうすれば を解放できconst char*
ますか? を使用して新しいメモリを割り当てましmalloc
たが、それを解放しようとすると、常に「互換性のないポインタ型」というエラーが表示されます
これを引き起こすコードは次のようなものです。
c++ - C ++での二重削除とメモリ破損をプロファイリングしてキャプチャする方法
c ++を使用してWindows 7でVS 2008でコンパイルしたアプリケーションがあり、これをキャッチしようとして例外が発生しました(リリースでコンパイルしたため)pdbファイルを作成しました。スタックの一部を確認しますが、エラーの場所に関するヒントは得られません。このエラーを発生させる無料の方法を探しています。これを行う無料の方法をお勧めできますか?
c++ - 「二重解放または破損」エラーを追跡する方法
(C++) プログラムを実行すると、このエラーでクラッシュします。
* glibc が検出されました * ./load: 二重解放または破損 (!prev): 0x0000000000c6ed50 ***
エラーを追跡するにはどうすればよいですか?
print ( std::cout
) ステートメントを使用してみましたが、成功しませんでした。gdb
これを簡単にできますか?
c - C では、free() が配列サイズを認識しているため、配列サイズを取得する関数がないのはなぜですか?
(ここでも stackoverflow を含む) を検索すると、malloc() が配列を割り当て、配列情報を制御するヘッダーも作成することがわかりました。
このヘッダーには、配列サイズもあります。free() はそのような情報を使用して、その配列の割り当てを解除する方法を知っています。
では、配列サイズ情報が "そこ" (メモリのどこかに) ある場合、なぜ配列ヘッダーでこれを探して配列サイズを返す関数がないのでしょうか? または、何か不足していますか?
c - Cでは、配列の最初または最後の位置のみを解放することは可能ですか?
配列がありますが、最初 (または最後) の位置は必要ありません。したがって、新しい変数を配列の残りの部分に向けますが、配列の最初/最後の位置を解放する必要があります。例えば:
それ以外の場合は、最初の位置を除いて、配列を他の変数に memcpy してから、元の配列を解放する必要があります。このような:
しかし、すべての配列をコピーするオーバーヘッドがあります。
配列の 1 つの位置だけを解放することは可能ですか?
c - Solaris/Linuxで割り当てられたメモリを解放する
このコードをアプリケーションに適用するパフォーマンスを測定するために、小さなプログラムを作成し、Solaris/Linuxプラットフォームでコンパイルしました。
プログラムはそのように書かれており、最初はsbrk(0)
システムコールを使用して、ヒープ領域のベースアドレスを取得しました。その後、システムコールを使用して1.5 GBのメモリを割り当てmalloc
、次にシステムコールを使用memcpy
して、割り当てられたメモリ領域に1.5GBのコンテンツをコピーしました。次に、割り当てられたメモリを解放しました。
解放した後、sbrk(0)
システムコールを再度使用してヒープサイズを表示しました。
これは私が少し混乱するところです。Solarisでは、割り当てられたメモリ(1.5 GB近く)を解放しましたが、プロセスのヒープサイズは膨大です。しかし、Linuxで同じアプリケーションを実行しました。解放した後、プロセスのヒープサイズは、1.5GBを割り当てる前のヒープメモリのサイズと同じであることがわかりました。
free()
Solarisがすぐにメモリを解放しないことは知っていますが、システムコールの直後にメモリを解放するようにSolarisカーネルを調整する方法がわかりません。
Linuxでも同じ問題が発生しないのはなぜですか?
c - Cの解放された構造体にまだデータがあるのはなぜですか?
このコードを実行すると:
私はまだ得ます
私は食べ物を解放しましたが。どうしてこれなの?メモリは本当に解放されていますか?
c++ - C++に相当するC++delete [](char *)
C++に相当するCは何ですか
編集:いくつかのC++コードをANSICに変換しています。
これはCのためにそれをしますか?
c - なぜメモリリークがないのですか?
以下は、可変長の定数文字を取得し、ログに記録するための適切な形式で出力するように設計されています。読者の皆さんには、これをどのように改善できるかについての提案があると確信しており、歓迎します。
私が困惑しているのは、ToHexString()が呼び出されるたびに、返された静的文字をfree()する必要があると思っていたことです。代わりに、メモリリークはまったく見られません。関数をインラインで使用しているので、その戻り値を変数に割り当てません。
この関数をループで呼び出す簡単なテストを作成しました。毎回、異なる長さのcStringパラメーターとnMaxCharsパラメーターを使用します。次に、VMのステータスを確認しました。テストプログラムのメモリ割り当てと空きメモリは変更されませんでした。
私には、mallocが呼び出されるたびに増加し、無料ではないはずだったようです。
呼び出しルーチンは次のとおりです。