4

私は実際に単純なC++SFMLゲームを作成しており、C++プログラミングについてもっと学びたいと思っています。

現在、shared_ptrを使用してリソースを管理しています。次のような新しいリソースを作成するときに、shared_ptrsについていくつか質問があります。

    shared_ptr< Resource > resource( new Resource( World::LEVEL ) );

Boostによると、shared_ptr <class Y>(Y * p)はbad_allocをスローします。std::tr1が同じことをするかどうかはわかりません。そして、bad_allocがスローされるかどうかをチェックするために、shared_ptrをtry/catchブロック内に配置することを心配する必要があるかどうかはわかりません。これは良いプログラミング手法ですか?

4

2 に答える 2

10

C ++ 2011標準によると、§20.7.2.2.1¶6:

template<class Y> explicit shared_ptr(Y* p);

スロー:bad_alloc、またはメモリ以外のリソースを取得できなかった場合の実装定義の例外。

例外の処理方法を知っていると、例外をキャッチします。メモリ不足の例外を処理し、それを実行するコードがある場合は、必ずそれをtry-catchに入れてください。ミッションクリティカルなコードを記述しておらず、システムメモリの制約のエッジで動作することを期待していない場合は、おそらく必要ありません。システムのメモリが不足すると、作成するコードのほとんどすべての行で例外がスローされる可能性があることに注意してください。

最新のハードウェア/オペレーティングシステムでは、「メモリ不足」は物理メモリの制約を超えたことを意味しないことに注意することが重要です。メモリは128MiBしかなく、10倍使用してもエラーは発生しません。 、および8GiBの物理メモリを使用して、半分しか使用していない場合にエラーが発生する可能性があります。これは、アプリケーションで使用可能なメモリスペースを指し、OSは必要に応じて(そして使用可能なディスクスペースを想定して)ディスクにページングします。

于 2013-01-01T10:15:55.513 に答える
3

shared_ptrをスローできるように、カウンターを割り当てる必要があります bad_alloc。(IIRCは、そうするときに、渡されたポインターに対してdeleteを呼び出します。)

あなたがそれを捕まえる必要があるかどうかは別の質問です。を作成する関数でそれをキャッチする必要はほとんどありませんshared_ptr。これは単なる別の失敗した割り当てであり、失敗した割り当てを処理する場所でキャッチされる(またはキャッチされない)必要があります。

于 2013-01-01T10:15:19.193 に答える