繁体   English   中英

类指针成员和异常处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM