2011-04-12 26 views
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_析構函數沒有被調用?

此外,如何確保內存不泄漏在這種情況下?

+0

什麼是你期待?析構函數沒有被調用,因爲'std :: runtime_error'沒有被捕獲。 – 2011-04-12 16:57:24

+0

我希望自data_構造完成後,它的析構函數會自動調用。如何確保分配的數據在發生異常時被釋放? – 2011-04-12 17:01:19

+0

如果從構造函數中拋出一個具體的異常,您的作用域數組可能仍然有一個引用。理想情況下,您希望捕獲此異常並進行處理,而不是解除中止。 – AJG85 2011-04-12 17:01:23

回答

2

我認爲問題是你的異常未被捕獲,並正在由終止處理程序處理。由於沒有catch來處理異常,因此編譯器無法知道需要「展開」多少。如果您發現異常,則會發生破壞。然後,您可以當然,如果你喜歡再扔它,例如:

#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[]) { 
    try { 
     MyClass a_class; 
    } catch (const std::runtime_error &) { 
     throw; 
    } 
} 

輸出如下:

$ ./test2 
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 
Delete a data 
Delete a data 
Delete a data 
Delete a data 
Delete a data 
Delete a data 
Delete a data 
Delete a data 
Delete a data 
Delete a data 
terminate called after throwing an instance of 'std::runtime_error' 
    what(): Shit happens 
Aborted 
相關問題