【发布时间】:2018-04-06 12:19:15
【问题描述】:
我有一组方法 B(), B1(),... 使用一些资源和一组方法 C(), C1(),... 释放这些资源,这些方法属于一个API(比如GLFW,OpenGL,...),我把它们放在A类的构造函数和析构函数中:
class A {
public:
A() {
B();
B1();
....
throw 1;
}
~A() {
C();
C1();
}
};
并且当异常发生时,~A()不能被调用,所以这个API使用的资源不能被释放。我不能使用智能指针来确保没有内存泄漏,我也不想在构造函数中尝试 catch 语句,因为创建了一个无用的对象。任何人都可以为这种情况提供任何解决方案吗?
【问题讨论】:
-
此外,您可以在构造函数中捕获、清理,然后重新抛出异常。不是很好的设计,但可以做到。
-
d'tor 没有被调用,因为对象没有被构造。你有一个设计缺陷,并且似乎有意避免所有可以修复它的做法。
-
您可以清理在抛出异常之前创建的所有内容。 (至少对于这个简单的例子)。
-
@BDL "(除非你将每个 OpenGL 对象都包装在一个 C++ 类对象中)" 这正是 C++ RAII(即 0/5 规则)的方式。