0

たとえば、初期化時に大量の大きなオブジェクトを割り当てるプログラムを書いたとします。その後、プログラムはしばらく (おそらく無期限に) 実行され、終了するときに、初期化された大きなオブジェクトがそれぞれ解放されます。

したがって、私の質問は、プログラムの寿命の終わりにメモリの各ブロックを個別に手動で割り当て解除するのに時間がかかるか、それともシステムにプログラムをアンロードさせ、システムによってプログラムに与えられたすべての仮想メモリの割り当てを解除する方がよいかということです同時に。

それは安全かつ/またはより速いでしょうか?また、安全な場合、とにかく最適化するように設定されている場合、コンパイラはこれを行いますか?

4

3 に答える 3

0

1) アプリケーションの終了時にすべてのシステムがメモリを解放するわけではありません。もちろん、最新のデスクトップ システムのほとんどはこれを行うため、Linux または Mac (または Windows) でのみプログラムを実行する場合は、割り当て解除をシステムに任せることができます。

2) 多くの場合、メモリを解放するだけでなく、終了時にデータを操作する必要があります。そのため、最後に手動でオブジェクトの割り当てを解除するのが困難なようなプログラム設計を開発しようとすると、後で終了する前にいくつかのコードを実行する必要があり、困難な問題に直面する可能性があります。

2') 場合によっては、プログラムが機能しなくなるまでいくつかのオブジェクトが必要になると考えていても、後でプログラムからライブラリを作成したり、プロジェクトを変更して大きなオブジェクトをロードおよびアンロードしたり、プログラムの設計が貧弱になったりすることがあります。これを困難または不可能にします。

3) さらに、プログラムの割り当て解除のパフォーマンスは、プログラムで使用する予定のアロケーターの実装に依存します。システムの割り当て解除は、システムのメモリ管理に依存し、単一のシステムでも複数の実装が存在する可能性があります。したがって、割り当て/割り当て解除のパフォーマンスの問題に直面している場合は、システムに期待するよりも、より優れたアロケーターを開発したいと考えています。

4)私の意見は次のとおりです。最後に手動でメモリの割り当てを解除すると、常に正しい方向に進んでいます。これを行わないと、場合によってはあいまいな利点が得られる可能性がありますが、遅かれ早かれ問題に直面する可能性があります。

于 2013-05-21T13:12:20.180 に答える
0

保守寿命が短いプログラムは、「exit() によってメモリ割り当てを解除し、カーネルにそれらを整理させる」のに適しています。ただし、プログラムが数か月以上続く場合は、メンテナンスの負担を考慮する必要があります。

たとえば、プログラムに後続のステージが必要であり、一部のデータが不要であるか、メモリ内に不要であることに誰かが気付く可能性があるとします。彼らは今、メモリの割り当てを解除する方法、古い参照を適切に削除する方法などを見つけなければなりません。

于 2013-05-21T13:06:56.167 に答える
0

プログラムの場合、ほとんどの OS は終了時にメモリを解放しますが、より大きな問題は、なぜそうしなければならないのかということです。

速いですか?時々記憶で言うのは難しい。とにかく、優れたコーディング慣行を破る価値はないと思います。

安全ですか?安全を定義する... OS はクラッシュしますか? おそらくそうではありません。コードは、メモリ リークやその他の問題の影響を受けやすいですか? 絶対に、そうなります。実際、基本的には、メモリリークが必要だと言っています。

ベスト プラクティスは、使い終わったら常にメモリを解放することです。C および C++ では、malloc されたメモリ ブロックまたは新しいメモリ ブロックには、対応する解放または削除が必要です。

メモリを解放するために OS に依存するのは悪い考えです。これは、コードの見栄えが悪くなり、移植性が低下するだけでなく、プログラムが別のプログラムに統合されていた場合、メモリ リークを追跡する可能性が高いからです。時間。

したがって、短い答えですが、常に手動で行ってください。

于 2013-05-21T13:04:14.680 に答える