あなたは手動でメモリを解放し、ファイルを閉じなければならないようなものですか?そうだとすれば、特に「メモリ管理」だけでなく「リソース管理」にそれを一般化した場合、私が使用した他のほとんどの言語よりも少なく、通常は少ないと言えます。その意味で、実際には、C ++はJavaやC#よりも手動のリソース管理が少なくて済むと思います。
これは主に、リソース(メモリなど)の破壊を自動化するデストラクタが原因です。通常、C ++でリソースを手動で解放/破棄する必要があるのは、vlowレベルのデータ構造(ほとんどの人が行う必要のないもの)を実装している場合、または少し時間を費やしているC APIを使用している場合のみです手動で解放/破棄/クローズする必要があるCリソースをRAII準拠のC ++ラッパーにラップします。
もちろん、ユーザーが画像編集ソフトウェアで画像を閉じるように要求した場合、コレクションなどから画像を削除する必要があります。しかし、このコンテキストで重要な種類の「メモリ」または「リソース」管理としてカウントされないことを願っています。その時点でそのイメージに関連付けられているメモリを解放する場合、それはほとんどの言語で必要です。ただし、コレクションから画像を削除するだけで、残りは画像デストラクタが処理します。
一方、たとえばJavaやC#と比較すると、そこでファイルを手動で閉じたり、ソケットを手動で切断したり、オブジェクト参照をnullに設定してガベージコレクションできるようにしなければならないことがよくあります。これらの言語でのリソース管理。C ++ではunlock
、ミューテックスがスコープ外になると、ミューテックスロッカーが自動的にミューテックスを行うため、手動でミューテックスを使用する必要さえありません。たとえば、C ++で次のようなことを行う必要はありません。
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
C ++でファイルを手動で閉じるようなことをする必要はありません。結果としてスコープ外に出た場合でも、通常の実行パスまたは例外的な実行パスの場合でも、スコープから出た瞬間に自動的に閉じます。のようなメモリ関連リソースについても同様ですstd::vector
。file.Close()
上記のようなコードは、特にfinally
ブロックのコンテキストでは、C ++に関する考え方全体がそれを自動化するときに手動でローカルリソースを解放する必要があることを示唆しているため、しばしば眉をひそめます。
手動のメモリ管理に関しては、Cが最大、Java / C#が中程度、C ++が最小のいずれかを必要とすると思います。C ++を習得するのは非常に難しい言語なので、C ++を使用することに少し恥ずかしがる理由はたくさんありますが、メモリ管理はその1つではありません。それどころか、私は実際、この一面で最も簡単な言語の1つだと思います。
もちろん、C ++を使用すると、手動でメモリを割り当てoperator delete/delete[]
、手動でメモリを解放することができます。また、あなたは次のようにC関数を使用することができますmalloc
し、free
。しかし、それは、人々が信用を与えるずっと前に時代遅れになったと思う種類の古代スタイルのコーディング慣行です。ですから、「モダンC ++」がリソース管理を自動化すると言うのはフェアではないと思います。そうしないと、例外安全性を実際に取得できません。90年代前半の多くの見当違いの開発者が、オブジェクトのあるCのようにC ++を使用しようとし、多くの場合例外処理を完全に無視し、そのように使用されることはありませんでした。実際に常に使用することを意図した方法でC ++を使用する場合、メモリ管理は完全に自動化され、通常は手動で処理する必要のある(または処理する必要のある)ことはほとんどありません。