効果的な C++ 3/Eで、私はこれを読みました:
これは、例外的に安全でないコードです。
class Test { };
void foo(const std::shared_ptr<Test> &ptr, int i);
int bar();
...
foo(std::shared_ptr<Test>(new Test), bar());
コンパイラは次のように実装できるため:
- 走る
new Test
- call
bar()
<--bar()
が例外をスローした場合、by によって割り当てられたオブジェクトは削除Test
できnew Test
ません。- のコンストラクターを呼び出す
std::shared_ptr<Test>
- 電話
foo()
ただし、この場合、コンパイラはメモリ リークがあることを認識できます。delete
例外がスローされた場合、コンパイラは自動的に実行できませんか?
さらに、delete
その場合、コンパイラは自動的に次のことを行います。
Test *p = new Test;
これは次のように実装されます:
operator new
メモリを割り当てる呼び出し- のコンストラクタを呼び出します
Test
。コンストラクターが例外をスローした場合、メモリは自動的に削除されます。
2番目のケースとは異なり、最初のケースでコンパイラが機能しないのはなぜですか?