4

C ++ 11を使用すると、その実装で(一部の)ガベージコレクションユーティリティを実行できます。なぜ標準はこれを許可するのでしょうか?私はいつも、C ++では、使用しないものにお金を払わないという印象を受けました。私にとって、(暗黙の)GCは、このイデオロギーを損なうように感じます。さらに、スマートポインタを介してC++で明示的なガベージコレクションユーティリティを記述して使用することは難しくありません。

次に、GCは他の方法で有効なプログラムを無効にします。例には、ポインタマスキングおよび関連する低レベルのポインタ「ハック」が含まれます。

int * nums = new int[10];
nums += 2;
*nums = 777; // nothing points to the new'ed int[10] at this point
// oh no! nums could have gotten collected!!! (so lets assume it was)
*nums = 666; // crash (or memory corruption (or something else that's bad))
4

1 に答える 1

5

GCはC++11標準で存在する必要はありませんが、将来のバージョンで存在する可能性があります。

それはあなたに強制されることはありません-あなたがそれを要求した場合にのみそこにあります。通常のポインターは収集されません。現在のスマートポインターは収集されません。それで、それはまだ「使用しないでください-それに対してお金を払わないでください」です。明示的に要求したポインターでのみ機能するため、例は現在と同じように機能します。

Sutter's Mill:Garbage Collection Synopsis、およびC++を参照してください。

多くの場合、参照カウント(#1)が最適であり、C++のデフォルト形式のGCです。しかし、潜在的なサイクルが避けられない場合を含め、C ++のレイジーマークスイープ(#2)ガベージコレクションで参照カウントでは処理できないものを処理する必要がある理由もあります(場合によっては、一部のオブジェクトは自然に共有されますが、相互に参照する可能性があります)およびロックフリーのABA問題。

「参照カウント」とは、Sutterが参照しstd::shared_ptrているものと同様のものです。

于 2012-12-28T09:08:17.127 に答える