1
int main()
{
    char *a = malloc(1024);
    return 0;
}

上記のプログラムにはメモリリークがありますか? 可能な限り完全で技術的な回答を提供してください。

4

4 に答える 4

4

簡単な答えはイエスです。OSがあなたのために片付けをしています

編集

gg.kaspersky の利益のために。

プログラムが最後に到達したら、ヒープを片付けているはずです。すべての割り当てを考慮し、それらのリソースの解放を提供したことを示しています (これは、開いているファイルや他の OS リソースにも当てはまります)。

これはあなたにとって十分に複雑ですか?

ところで - 家(OS)を訪問するときは、到着したときと同じ状態のままにしておくのがマナーです。

于 2013-03-13T12:30:55.100 に答える
1

メモリリークだとは思いません。終了時にスコープ内にある変数を介して、メモリに引き続きアクセスできます。

プログラムの最後に割り当てたすべてのメモリを解放することは、不必要に衒学的であり、オペレーティングシステムがはるかに効率的に行うことを行うために時間を費やすようになります。

編集(技術的な詳細):

プログラムの最後にメモリを不要に解放するmallocの実装によっては、ひどく非効率になる可能性があります。(境界タグまたは同様のメカニズムを介して)アカウンティング情報をインラインに保つすべてのmalloc実装は、すべてではないにしても、割り当てたほとんどのページにアクセスします。通常、これは、破棄されるキャッシュラインとTLBエントリをダーティにする以外は問題になりませんが、これを、スワップの使用を開始するのに十分なメモリを使用するプログラムと組み合わせると、解放するためだけに大量のメモリをスワップすることになります。オペレーティングシステムは、終了時にこれをはるかに効率的に実行できます(スワップスロットを空きとしてマークするだけです)。

オペレーティングシステムにメモリを返すmalloc実装がある場合、メモリを解放すると、オペレーティングシステムがメモリのマップを解除し、マルチプロセッサシステムを使用している場合は高価なTLB操作が必要になります。終了時に、無効化をはるかに効率的に行うことができます(完全なTLBフラッシュを実行するか、TLBタグを無効化することによって)。

于 2013-03-13T12:35:28.137 に答える
1

あなたの質問は不完全です...そのため、あなたが得ることができる最良の答えは「場合によります」です。

プログラム スコープからは、はい、メモリ リークがあります。それくらいは明らかなはずです。システム スコープからの答えは、実行しているオペレーティング システムによって異なります。

一般に、メイン ストリーム デバイス (Win7/MacOSX/Linux デスクトップ/ラップトップ コンピューター、iOS/Android デバイスなど) でプログラミングしている場合は、かなり安全です。あなたの後にクリーンアップできない主流の最新のオペレーティングシステムは考えられません。

ただし、古いシステムや組み込みシステムで作業している場合は、ここでメモリ リークが発生します。uCLinux プラットフォーム (MMU[メモリ管理ユニット] を持たないハードウェア用に特別に設計された OS) でメモリ リークが発生するのを見てきました。

動的メモリは一般に危険と見なされているため、一部の RTOS で使用することは合法ではありません。アプリケーションの使用期間全体にわたってアプリケーションの展開の範囲を知っている場合は、このようにコーディングしても問題ありません...しかし、そうではない可能性が高く、OS が何をするかについて仮定をするべきではありません。 . 常に自分の混乱を片付けてください。

于 2013-03-13T12:45:39.203 に答える