タグ付けされた質問 「free」

17
mallocの後で解放しないと、本当に何が起こりますか?
これは、私を長年悩ませてきたものです。 私たちは皆、学校で教えられています(少なくとも、私はそうでした)、割り当てられているすべてのポインタを解放する必要があるということです。ただし、メモリを解放しない場合の実際のコストについては少し気になります。mallocループまたはスレッド実行の一部の中で呼び出された場合など、いくつかの明らかなケースでは、メモリリークがないように解放することが非常に重要です。ただし、次の2つの例を検討してください。 まず、次のようなコードがある場合: int main() { char *a = malloc(1024); /* Do some arbitrary stuff with 'a' (no alloc functions) */ return 0; } ここで実際の結果は何ですか?私の考えでは、プロセスが終了してヒープ領域がなくなるため、呼び出しを逃しても害はありませんfree(ただし、閉鎖、保守性、および適切な運用のためにそれをとることの重要性は認識しています)。私はこの考えで正しいですか? 次に、少しシェルのように動作するプログラムがあるとします。ユーザーはのような変数を宣言できaaa = 123、それらは後で使用できるようにいくつかの動的データ構造に格納されます。明らかに、いくつかの* alloc関数(ハッシュマップ、リンクリストなど)を呼び出すソリューションを使用することは明らかです。この種のプログラムではmalloc、これらの変数はプログラムの実行中に常に存在している必要があり、静的に割り当てられたスペースでこれを実装するための良い方法(私が見ることができない)がないため、呼び出し後に解放しても意味がありません。割り当てられているがプロセス終了の一部としてのみ解放されている大量のメモリがあるのは悪い設計ですか?もしそうなら、代替は何ですか?
538 c  malloc  free 

11
freeはどのようにして解放する量を知っていますか?
Cプログラミングでは、解放する引数として任意の種類のポインタを渡すことができますが、解放するために割り当てられたメモリのサイズはどのようにしてわかりますか?いくつかの関数へのポインターを渡すときはいつでも、サイズも渡す必要があります(つまり、10要素の配列は、配列のサイズを知るためにパラメーターとして10を受け取る必要があります)。ただし、サイズを渡す必要はありません。無料機能。なぜそうしないのか、そして同じ長さの関数を自分の関数で使用して、配列の長さの追加の変数をあちこち移動する必要がないようにすることができますか?
385 c  size  pointers  free 

13
malloc()とfree()はどのように機能しますか?
どうやっmallocてfree仕事をしたいのか知りたい。 int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout << p; free(p); // Obvious Crash, but I need how it works and why crash. cout << p; return 0; } 可能であれば、答えがメモリレベルで詳細にある場合、私は本当に感謝します。

23
解放後に変数をNULLに設定
私の会社では、メモリを解放した後、変数をにリセットするというコーディングルールがありますNULL。例えば ​​... void some_func () { int *nPtr; nPtr = malloc (100); free (nPtr); nPtr = NULL; return; } 上記のコードのような場合、に設定しNULLても意味がないと思います。それとも何か不足していますか? そのような場合に意味がない場合は、このコーディングルールを削除するために「品質チーム」に取り上げます。アドバイスをお願いします。

10
ptrがNULLであるfree(ptr)はメモリを破壊しますか?
理論的には free(ptr); free(ptr); すでに解放されているメモリを解放しているため、メモリ破損です。 しかし、もし free(ptr); ptr=NULL; free(ptr); OSは未定義の方法で動作するので、何が起こっているのかについてこれに関する実際の理論的分析を得ることができません。私が何をしていても、このメモリ破損はありますか? NULLポインタの解放は有効ですか?

8
「ダブルフリーまたは破損」エラーを追跡する方法
(C ++)プログラムを実行すると、このエラーでクラッシュします。 * glibcが検出されました*。 / load:ダブルフリーまたは破損(!prev):0x0000000000c6ed50 *** エラーを追跡するにはどうすればよいですか? print(std::cout)ステートメントを使用しようとしましたが、成功しませんでした。でしたgdbこれを簡単にしますか?
95 c++  c  debugging  free 

12
Cの `free`が解放されるバイト数を受け取らないのはなぜですか?
明確にするために:私はそれを知ってmallocおりfree、Cライブラリに実装されています。Cライブラリは通常、OSからメモリのチャンクを割り当て、独自の管理を行ってアプリケーションに少量のメモリを分割し、割り当てられたバイト数を追跡​​します。この質問は、無料がどれだけ解放するかをどのように知るかではありません。 むしろ、freeそもそもなぜこのように作られたのか知りたい。低水準言語であるため、Cプログラマーに、割り当てられたメモリだけでなく、どのくらいの量も追跡するように依頼するのは完全に合理的だと思います(実際、私は通常、バイト数を追跡​​することになります。とにかくmalloced)。また、バイト数を明示的に指定freeすると、パフォーマンスの最適化が可能になる場合があります。たとえば、割り当てサイズが異なる個別のプールを持つアロケータは、入力引数を確認するだけで、解放するプールを決定できます。全体的にスペースのオーバーヘッドが少なくなります。 だから、要するに、なぜし、mallocそしてfreeそれらは内部的に割り当てられたバイト数を追跡するために必要としているように作成?それは単なる歴史的な事故ですか? ちょっとした編集:「割り当てた金額とは異なる金額を解放したらどうなるか」などのポイントを提供している人もいます。私が想像したAPIは、割り当てられたバイト数を正確に解放するために1つを必要とするだけです。多かれ少なかれ解放することは、単にUBまたは実装定義である可能性があります。しかし、他の可能性についての議論を思いとどまらせたくはありません。

3
freeの戻り値をvoidにキャストする理由
私はCを使用した本(Butenhofによるプログラミング、POSIXスレッドによるプログラミング、1997)を読んでいて、次の行に出くわしました。 (void)free(data); ここでdataは、割り当てられた構造体への単なるポインタですが、 data = malloc(sizeof(my_struct_t)); freeキャストされた結果はなぜvoidですか? Cについての私の理解から、これは2つの理由で意味をなさないようです: 無料の関数はすでに戻ります void コードは戻り値を使用していません(変数に割り当てられていません) 本は1997年に書かれました。これはある種のレガシーなものですか? 著者は、例がDigital Unix 4.0dで実行されたと述べていますが、その結果を使用しないのであれば、関数の結果をキャストする理由を想像することはできません。
82 c  casting  free  void  legacy-code 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.