簡単に言えば、それは一般的にプログラミング作業を複雑にするからです。手動のメモリ管理を正しく行うには、かなりのスキルと努力が必要です。その努力は、解決しようとしている実際のタスクには使用できません。
上記のシナリオは一般的ですが、唯一のシナリオではありません。オブジェクトの 1 つへの参照を返すとどうなるでしょうか。呼び出されたメソッド (格納される場所) への参照を渡すとどうなるでしょうか? などなど。これらはすべて、オブジェクトを責任を持って破棄する前に考慮する必要がある問題です。これらはまとめて「所有権」として知られています。
コインの反対側は、実行中に特定の時点でオブジェクトを破壊できることは本当にプラスの効果があるのでしょうか? これにより、非常に強力なイディオムである C++ のデストラクタと RAII が可能になります。Java にはそれがなく、私が Java を使い始めたとき、私はしばしばそれを見逃していました。ただし、Java でもこれらの問題を効果的に解決する方法があります (finally
ブロックなど)。RAII がいかに洗練されていても、手動のメモリ管理によって引き起こされる可能性があるすべての混乱に見合うものではありません。
次に、「必要に応じてオブジェクトを明示的に破棄し、残りはガベージ コレクションであるという両方を実現できないのはなぜですか?」と提案するかもしれません。そして、コンパイラの作成者や JVM の実装者があなたを捕まえる前に、あなたはカバーのために走り始めることができます :-) それは問題を非常に複雑にするでしょう。手動のメモリ管理では、そのようなことはできません。