这是C ++ Primer第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:
如果引发异常,有两种方法可以使先前的代码正常工作。描述并实施它们。
我知道我们可以使用智能指针来避免这种陷阱:
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.
}
如果发生异常,则抛出p
以初始化另一个指针并删除该指针。我知道这不是一个完美的解决方案,因为可能会发生其他异常,因此我什至没有机会抛出异常p
。但是我想不到更好的了。您能帮忙找到第二种方法吗?
您可以显式捕获并重新引发异常:
void exercise(int *b, int *e)
{
vector<int> v(b, e);
int *p = new int[v.size()];
try {
ifstream in("ints");
// exception occurs here
} catch (...) {
delete[] p;
throw;
}
delete[] p;
}
当然,如果您有多个资源要释放,那么效果就不太好,因为您可能最终会嵌套嵌套的try / catch块。更不用说您有两个delete
1 new
。因此,RAII是首选。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句