2011-04-12 80 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 
相关问题