は私がC++クラスに次のコンストラクタを持っていると仮定したときにローカル・バッファの解放:は、C++で例外をスローが
MyClass::MyClass()
{
char* buffer = malloc(100);
if (0 != someD3DXCallThatCanFail(..., buffer, ...))
{
free(buffer);
throw MyException(L"some message");
}
char* buffer2 = malloc(200);
if (0 != anotherD3DCallThatCanFail(..., buffer2, ...))
{
free(buffer);
free(buffer2);
throw MyException(L"another message");
}
.. more code here where buffer and buffer2 are still used
free(buffer);
free(buffer2);
}
編集:私はmalloc関数/自由で新しい嫌い/削除を行うが、残念ながら私はバッファを使用する必要がありますテクスチャを読み込み、ID3D10ShaderResourceView、ID3D10Buffer、頂点バッファなどに渡します。これらはすべて、バッファへのポインタを必要とします。
エラーコードを返す代わりに例外を使用するために何をしようとしていますか。 また、バッファが必要な場所に作成し、不要になった直後にバッファを解放したいと考えています。
しかし、エラーの場合、エラーコードを返したり例外をスローしたりしても、その時点までに作成されたバッファはすべてクリーンアップする必要があります。 10個のバッファと10個のエラーポイントがある場合は、free()を100回呼び出す必要があります(エラーごとに各バッファを解放することを忘れないでください)。
私の同僚は、あるロジックを変更したいと思います。たとえば、真ん中の別のバッファを追加したいとします。今度は、メソッドの残りの部分で起こりうるすべてのエラーを見て、そのような場所にそのバッファのfree()を追加する必要があります。彼が急いでいる場合、彼は簡単にそのような場所をいくつか見落とすことができ、あなたはメモリリークを持っています。
これもコードを非常に大きくします。
finallyキーワードは、JavaまたはC#でこの問題を解決します。コード内のどこで例外が発生しても、私はまだ "finally"のすべてのバッファをクリーンアップします(ガベージコレクションでは必要ありません)。私が理解しているところからC++では、そのようなバッファのメンバ変数を作成しなければならないかもしれませんし、デストラクタでバッファがクリーンアップされていることを確認してください。 "pBuffer"という名前のメンバ変数は、私的なものであっても、1つのメソッド(この場合はコンストラクタ)でのみ使用され、常にNULLになりますので、私にとってはかなり醜いと思われます。時間。
一般的な問題である必要がありますが、検索を使用して回答を見つけることはできませんでした。ありがとう!
絶対に必要でない限り、C++で 'malloc/free'を使用する習慣から脱出する必要があります。代わりに 'new/delete'を使うことをお勧めします。 –
真実ですが、 'new/delete'を使用しない方がいいです:)コンテナやスマートポインタなどを使って手動でメモリを管理しないようにします。彼らは例外安全性を保証することをずっと容易にします。 –
@Dave - それをやったら、さらに簡単な人生のためにスマートポインタを使って 'new'と' delete'を避けてください –