QScopedArrayPointer保护我的数据,但它仍然在泄漏

QScopedArrayPointer guarding my data but it is still leaking

本文关键字:泄漏 保护 保护我 我的 数据 QScopedArrayPointer      更新时间:2023-10-16
#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;
}

运行此程序将输出:

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_destructor ?

另外,我如何确保内存不泄漏在这种情况下?

我认为问题是您的异常未被捕获并且正在由终止处理程序处理。由于没有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