2
#include <QScopedArrayPointer>
#include <QDebug>
#include <stdexcept>
class MyData{
public:
MyData() {
qDebug() << "Construct a data";
}
~MyData() {
qDebug() << "Delete a data";
}
private:
float internal_data_;
};
class MyClass{
QScopedArrayPointer<MyData> data_;
public:
MyClass(){
data_.reset(new MyData[10]);
throw std::runtime_error("Shit happens");
}
};
int main(int argc, char *argv[])
{
MyClass a_class;
return 1;
}
运行这个程序将会输出:QScopedArrayPointer守着我的数据,但它仍然是泄漏
Construct a data
Construct a data
Construct a data
Construct a data
Construct a data
Construct a data
Construct a data
Construct a data
Construct a data
Construct a data
terminate called after throwing an instance of 'std::runtime_error'
what(): Shit happens
The program has unexpectedly finished.
权runtime_error之前,变量data_中已经完全建立。为什么data_析构函数没有被调用?
此外,如何确保内存不泄漏在这种情况下?
什么是你期待?析构函数没有被调用,因为'std :: runtime_error'没有被捕获。 – 2011-04-12 16:57:24
我希望自data_构造完成后,它的析构函数会自动调用。如何确保分配的数据在发生异常时被释放? – 2011-04-12 17:01:19
如果从构造函数中抛出一个具体的异常,您的作用域数组可能仍然有一个引用。理想情况下,您希望捕获此异常并进行处理,而不是解除中止。 – AJG85 2011-04-12 17:01:23