RAIIについて読めば読むほど、スタックを使用することがコードが例外に対して安全であることを確認する方法であることがわかりました。
それは、自分のコードでa を実行するたびにnew()
、RAII の原則を使用して実行するより良い方法があるという意味で何か間違ったことをしていることを意味しますか?
を使用する場合、必ずしも間違ったことをしているわけではありません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 に代わるリソース管理戦略がありますが、それらを使用している場合はそれについて知っているはずであり、それは「間違っている」と見なされるものに影響します。
RAII の本当の意味を十分に理解していないと思います。ファイルやデータベースへの接続などの他のリソースがプログラムで必要とされるのと同じように、動的割り当て。RAII は、これらのリソースを管理する方法に焦点を当てており、その方法は、自動ストレージ期間 (スタックまたは別のオブジェクトのメンバー) を持つオブジェクトによってリソースを管理することです。
これは、すべてのリソースをスタックに割り当てる必要があるという意味ではありませんが、ヒープに何かを割り当てる場合は、そのメモリを管理する責任をスタック内のオブジェクトに委任する必要があります。
全くない。獣の性質(割り当て要件)が本当に動的である場合、最終的には、スタックポインターのヒープまたはいくつかの重大なトリックから発生します。
あなたができる最善のことは、あなたのためにスコープガードするラッピングを使用することです。(スコープで保護された動的一時バッファーが必要な場合に、std :: vector <>を使用する頻度を教えてください)。これは、STLなどの適切に保守および設計されたライブラリを使用する最も理想的な理由の1つです。C#やJavaとは異なり、予測可能であり、本当に必要なときに非常に価値があります。
いいえ、スタックスペースは非常に限られているため、巨大なものを置きたくないため、スタックオーバーフローという用語が使用されています。また、関数よりも長い寿命を持つオブジェクトが必要な場合は、スタックに置くことはできません。