[英]Class pointer members and exception handling
假设我们有一个类似以下的类:
class A {
public:
A();
~A();
void foo();
int* pointer;
};
A::A() {
pointer = new int;
}
A::~A() {
delete pointer;
}
A::foo() {
throw "error";
}
以下是利用它的示例:
例子1
int main() {
A a;
throw "error";
return 0;
}
例子2
int main() {
A a;
a.foo();
return 0;
}
在这两种情况下,都会发生内存泄漏,因为由于未处理的异常,永远不会调用A的析构函数。
我的问题是类的用户是否应承担责任,以确保通过处理异常来调用析构函数:在第一个示例中,该异常与类无关,因此我假设责任由类的用户承担。类,但是在第二个示例中,类本身引发了错误-是否仍然由类的用户来确保正确处理异常,还是这仅仅是类本身的错误设计?
void throw();
这不会编译。 throw
是保留关键字。
暂时忽略此细节,您的最初假设并不完全正确。
在这种情况下,不会捕获异常,程序将终止,因此内存泄漏是学术性的。
但是,如果作用域中有一个try/catch
块,它将捕获异常,则在两种情况下都不会发生内存泄漏。 在两个示例中,都完全构造a
对象。 因此,抛出的异常会摧毁a
,并调用它的析构函数。
引发的异常将展开堆栈,直到捕获到异常为止;作为该过程的一部分,销毁本地范围内的所有对象,直到捕获到异常为止。
因此,这是一个有争议的问题。 只要最终捕获到异常,就不会发生内存泄漏,并且没有人需要担心任何事情。
您显示的类大体上符合RAII
原则(需要一个复制构造函数和一个赋值运算符来包装松散的结局)。 该类唯一负责的是如果在构造函数中引发异常,则无论构造函数分配了什么,都需要清除。
这是无关紧要的。 出现“内存泄漏”的唯一原因是该程序将终止,这通常会清理内存。
无论如何,如果程序由于未处理的异常而退出,这不是类的问题。 想象一下,如果您有100个类,那么所有这些类都需要关心一个函数( main
)是否无法处理异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.