4

This question is as in title: Is it possible to produce a memory leak without using any kernel specific means like malloc, new, etc?

What if I will make a linked list inside a function with lot of elements in there, and after it I'll exit from this function without cleaning a list. The list will be created without using any malloc calls, i.e.

struct list_head {
     struct list_head *next, *prev;
}

Can it be guaranteed that all resources will be freed after exiting from this function? So I can freely execute it a million times and nothing will be leaked?

Subject: If you not using any particular malloc or new calls you won't get a heap memory leak. Never. Is that right?

4

5 に答える 5

12

リークは常にリソースに接続されています。リソースは定義上、手動で取得し、手動で解放する必要があるものです。メモリはその代表的な例ですが、他にもリソースがあります (ファイル ハンドル、ミューテックス ロック、ネットワーク接続など)。

リソースを取得した後、そのリソースへのハンドルを失い、誰もリソースを解放できなくなると、リークが発生します。より少ないバージョンのリークは、リソースを解放しない「まだ到達可能な」種類の状況ですが、まだハンドルがあり、それを解放することができます。これは主に怠惰によるものですが、対照的に、リークは常にプログラミング エラーです。

コードはリソースを取得しないため、リークも発生しません。

于 2013-09-24T08:56:16.287 に答える
1

malloc または new を指定せずに適用した変数は、メモリ内のスタック スペースに配置されます。したがって、関数が返されると、変数が取り戻されます。

一方、malloc や new で適用したメモリはヒープ領域にあります。システムは、スペースを解放するかどうかを気にしません。この場合、free や delete を使用しないとメモリ リークが発生します。

于 2013-09-24T08:56:56.387 に答える
0

malloc()ヒープからメモリを割り当てますが、文字列および構造体リテラル (およびそれらの ) のスペースはstring1、コンパイル時にスタックで予約されます。string2list_head

実際には、プログラム (ヒープまたはスタック) に割り当てられたメモリは、プロセスが終了するときにカーネルによって再利用されます (少なくとも *nix システムでは)。

メモリ リークは、ヒープにメモリを割り当て、プログラムの終了時にメモリを解放しないことと定義します。この定義は実際にあなたの質問に答えます。

ヒープにメモリを割り当てる標準関数 ( などstrdup) があります。注意してください。

于 2013-09-24T08:57:20.987 に答える