0

リンクされたリスト (LL) を扱っているときに、新しいノードを d LL に挿入するための関数 insert(parameters) を書いているとしましょう。そのために、次のような関数を記述します。

temp = (node *)malloc(sizeof(node)); 

つまり、「temp」にスペースを割り当てているということです。関数から戻った後、この一時変数はスコープを失い、その有効期間も終了します。だから今は死んでいる。しかし今、私の疑問は次のとおりです。

「割り当てたメモリは、関数から戻った後でも完全に制御できますか?」

新しく割り当てられたメモリに対する私たちの制御について質問しています。印刷または操作を行うと、結果が得られます。しかし、その記憶はまだ私たちに捧げられていますか? 環境 (OS) がそのメモリを使用したい場合、それは制限されていますか、またはそのメモリを使用する権限がありますか?

4

3 に答える 3

0

free()メモリへのすべてのポインタをスコープから外して追跡できなくなったとしても、メモリは d になるまで割り当てられたままになります。誰かが常に割り当てられたメモリを解放する「責任者」です。関数のドキュメントでは、関数がユーザーからポインターの制御を取得するか、それをユーザーに渡すかを説明する必要があります (malloc()ポインターを返すことによってそれ自体が行うように)。あなたはおそらくここでメモリをリークしています。

于 2013-09-02T16:32:15.367 に答える
0

明確にするために:割り当てられたメモリは、プログラムによって割り当てられます。プログラムを終了すると、プログラムが消去されます。それまでは、個人的な使用のみに限定されます。

唯一の制限は、OS がこのメモリの割り当てを拒否した場合です。(malloc のマニュアルを参照)

また、この割り当てられたメモリの追跡を失っても、それは消去されません。アクセスできないだけです (これはリークと呼ばれ、メモリが失われます。ただし、OS が終了時にそれを取得できることを心配しないでください)。

于 2013-09-02T16:32:53.180 に答える
0

を呼び出さなかった場合free()でも、メモリは引き続き使用できるように割り当てられています。範囲外になる場合tempは、リークしましたが、それを使用する場所をどのように見つけますか?

于 2013-09-02T16:32:01.960 に答える