これはC++入門、18章から運動ですスロー:メモリ私たちが直接管理しているため、上記のコードは、メモリリークを引き起こす方法メモリリークを回避するために、例外が
void exercise(int *b, int *e)
{
vector<int> v(b, e);
int *p = new int[v.size()];
ifstream in("ints");
// exception occurs here
}
(すなわちp
)が自動的にではありません例外が発生すると解放されます。
練習18.3:
例外がスローされた場合、正しく前のコードを動作させるためには、2つの方法があります。それらを記述して実装してください。
私たちは、この落とし穴を避けるために、スマートポインタを使用することができます知っている:
void exercise(int *b, int *e)
{
vector<int> v(b, e);
unique_ptr<int[]> p(new int[v.size()]);
ifstream in("ints");
// exception occurs here
}
か:
void exercise(int *b, int *e)
{
vector<int> v(b, e);
shared_ptr<int> p(new int[v.size()], [](int *p){ delete[] p; });
ifstream in("ints");
// exception occurs here
}
私はこれらがTWO
方法があるかはわかりません。結局、彼らは事実上同じです。だから私は、別の方法を考えた:
void exercise(int *b, int *e)
{
vector<int> v(b, e);
int *p = new int[v.size()];
ifstream in("ints");
// exception occurs here
if(!in)
throw p;
}
// caller
try {
exercise(b, e);
} catch (int *err) {
delete[] err; // initialize err with b and delete e.
}
例外が発生した場合は、別のポインタを初期化し、その1を削除するp
を投げます。私は完璧な解決策ではないことを知っています。なぜなら、他の例外が発生して、p
を投げる機会さえもないからです。しかし、私はより良いものを考えることはできません。第二の方法を見つけるのを助けてくれますか?
関数内のすべて( '...')の単純なtry-catchについてはどうですか?それを削除して、そこに戻ってください。 ...あるいは、 'p'のためにベクトルを使うのはどうですか? – deviantfan
ああ、はい、この問題のために 'rethrow'がはるかに優れています。ありがとうございました! – chihyang
あなたは 'ベクトル p(v.size());'を忘れています。 –