c++ - QScopedArrayPointer 保护我的数据,但它仍在泄漏

标签 c++ qt memory-leaks smart-pointers

#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_ 析构函数?

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

最佳答案

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

关于c++ - QScopedArrayPointer 保护我的数据,但它仍在泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5638761/

相关文章:

windows - Windows 中的不朽进程;没办法杀死它

c - Valgrind 无效释放,内存泄漏

java - ChooserActivity 泄露了 IntentReceiver

c++ - 如何在 C++ 14 的类中启动线程?

c++ - 在 Linux 上,命令行程序 mktemp 是否不如 C 函数 mkstemp 安全?

C++打印数组

c++ - Char* 数组内存泄漏

c++ - 我怎么知道使用caffe framwork和c++程序的层中是否不存在偏差

c++ - 如何防止子 QGraphicsItem 与父级一起移动?

c++ - 使用 qt 进行 SSL 握手时出错