42

C++11の言語機能リストには次のものがあります。

ガベージコレクションと到達可能性ベースのリーク検出の最小限のサポート

(ただし、GCCとClangのどちらにも実装されていないようです。)

標準委員会がこのガベージコレクションC++言語機能を導入したのはなぜですか?

C ++には本当にGCが必要ですか?RAIIはそのような優れたパターンではありませんか(ソケット、ファイル、テクスチャなどのメモリリソースと非メモリリソースの両方に均一に使用できます...)?

GCは、RAIIを使用するC ++コードパターンの均一性を破りますか?

GCは循環依存関係を解消するのに役立つと言う人もいますがweak_ptr、この目的のようにスマートポインターを使用しても問題ありませんか?

そして、例外がスローされた場合はどうなりますか?GCを考慮に入れるために、スタックアンワインドセマンティクスをどのように変更しますか?

また、C#のようなIDisposableパターンも導入されますか?

さらに、GCがC ++で導入されたと仮定すると、ポインターの構文は異なりますか?^たとえば、C ++/CLIまたはC++/ CX拡張機能のような帽子のような「ポインタ」はありますか?通常の生のポインタと「管理された」ポインタを区別する方法があるはずですよね?

4

3 に答える 3

59

この提案では、ガベージコレクターは導入されていません。実装で選択された場合、特定の状況でガベージコレクターが許可されるだけです。この規格では、これらの状況を未定義の動作を引き起こすものとして説明しています。これを行うことで、実装の要件が緩和され、ガベージコレクターに最小限の余裕が与えられます。

提案に示されている簡単な例では、動的に割り当てられたオブジェクトへのポインターを取得し、それを別の値とXORして、ポインター値を非表示にし、元のポインター値を復元してオブジェクトにアクセスする場合を考慮しています。C ++ 11より前は、これは完全に問題なく、引き続き使用できます。ただし、このような操作は(次の段落を参照)未定義の動作と見なされる可能性があります。つまり、実装、ポイントされたオブジェクトに対してガベージコレクションを実行する可能性があります。

この標準では、実装でポインターの安全性を緩和することができます。この場合、動作は以前と同じになります。または、ポインターの安全性を厳密にすることで、ガベージコレクターを導入できます。

実装によってポインターの安全性が緩和された可能性があります。その場合、ポインター値の有効性は、それが安全に派生したポインター値であるかどうかに依存しません。あるいは、実装に厳密なポインターの安全性がある場合があります。その場合、参照される完全なオブジェクトが動的ストレージ期間であり、以前に到達可能であると宣言されていない限り、安全に派生したポインター値ではないポインター値は無効なポインター値です(20.6.4 )。[...]実装がポインターの安全性を緩和したか、厳密にしたかを定義する実装です。

ポインタ値は、動的に割り当てられたオブジェクトを指し、それに面白いビジネスが発生していない場合、安全に派生したポインタ値です(§3.7.4.3でより具体的に定義されています)。

実装に厳密なポインターの安全性があるにもかかわらず、未定義の動作を導入せずにポインターに対して上記の面白いビジネスを実行したい場合は、次のpようにポインターを到達可能として宣言できます。

declare_reachable(p);

この関数は、、、、などの関連関数とともにヘッダーで定義さ<memory>れます。を使用して、実装の厳密さを判断することもできます。undeclare_reachabledeclare_no_pointersundeclare_no_pointersget_pointer_safety

于 2013-03-01T12:22:12.177 に答える
20

Bjarne Stroustrupから:

実際、私が言ったことは、「自動ガベージコレクションがC ++の一部になるとき(そうでない場合)、それはオプションになる」というようなものでした。

http://www.stroustrup.com/slashdot_interview.html

于 2013-03-01T12:26:24.397 に答える
1

このGCサポートを標準から削除する提案があります。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2186r0.html

C ++ GC(Boehm)があります: https ://www.hboehm.info/gc/

于 2020-12-08T12:22:24.833 に答える