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