0

RAIIについて読めば読むほど、スタックを使用することがコードが例外に対して安全であることを確認する方法であることがわかりました。

それは、自分のコードでa を実行するたびにnew()、RAII の原則を使用して実行するより良い方法があるという意味で何か間違ったことをしていることを意味しますか?

4

4 に答える 4

2

を使用する場合、必ずしも間違ったことをしているわけではありませんnewが、正しいことを確認する価値があります。

  • 式の結果はnew、通常はコンストラクターに直接渡すことによって、スマート ポインターの制御下にすぐに配置する必要があります。
  • そのスマート ポインターが の場合shared_ptrは、おそらく間違っています。make_sharedおそらく代わりに使用する必要があります。すべきではない状況 (weak_ptr大きなオブジェクトへの使用) と、そうでない状況 (Boost なしの C++03) があります。
  • 独自のスマート ポインター クラスを作成していない限り、使用する場合はdeleteほとんど間違っています。その場合でも、スマート ポインターは別のスマート ポインターを使用して作業を節約できる場合があります。
  • これは必須ではありませんがnew、オブジェクトが「スタックには大きすぎる」という理由だけで使用する場合は、オブジェクトのハンドルとして機能するクラスを作成し、それを使用unique_ptrまたはscoped_ptr管理することを検討してください。それらが扱うオブジェクトは自動変数です。気が向いたら、これを完全な PImpl イディオムに拡張できます。別のクラスが必要ない場合でも、オブジェクトを作成して aunique_ptrを返す関数を検討してください。これを のように呼び出すことができますauto foohandle = give_me_a_foo();。その後、 がgive_me_a_foo含まれますnewが、他のユーザー コードには含まれず、自動的に RAII オブジェクトに詰め込むことを推奨します。

C++ の RAII に代わるリソース管理戦略がありますが、それらを使用している場合はそれについて知っているはずであり、それは「間違っている」と見なされるものに影響します。

于 2012-09-15T08:45:24.323 に答える
2

RAII の本当の意味を十分に理解していないと思います。ファイルやデータベースへの接続などの他のリソースがプログラムで必要とされるのと同じように、動的割り当て。RAII は、これらのリソースを管理する方法に焦点を当てており、その方法は、自動ストレージ期間 (スタックまたは別のオブジェクトのメンバー) を持つオブジェクトによってリソースを管理することです。

これは、すべてのリソースをスタックに割り当てる必要があるという意味ではありませんが、ヒープに何かを割り当てる場合は、そのメモリを管理する責任をスタック内のオブジェクトに委任する必要があります。

于 2012-09-15T02:19:32.000 に答える
1

全くない。獣の性質(割り当て要件)が本当に動的である場合、最終的には、スタックポインターのヒープまたはいくつかの重大なトリックから発生します。

あなたができる最善のことは、あなたのためにスコープガードするラッピングを使用することです。(スコープで保護された動的一時バッファーが必要な場合に、std :: vector <>を使用する頻度を教えてください)。これは、STLなどの適切に保守および設計されたライブラリを使用する最も理想的な理由の1つです。C#やJavaとは異なり、予測可能であり、本当に必要なときに非常に価値があります。

于 2012-09-15T01:15:41.133 に答える
0

いいえ、スタックスペースは非常に限られているため、巨大なものを置きたくないため、スタックオーバーフローという用語が使用されています。また、関数よりも長い寿命を持つオブジェクトが必要な場合は、スタックに置くことはできません。

于 2012-09-15T01:12:24.337 に答える