Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QscopeDarray指针保护我的数据,但它仍在泄漏_C++_Qt_Memory Leaks_Smart Pointers - Fatal编程技术网

C++ QscopeDarray指针保护我的数据,但它仍在泄漏

C++ QscopeDarray指针保护我的数据,但它仍在泄漏,c++,qt,memory-leaks,smart-pointers,C++,Qt,Memory Leaks,Smart Pointers,就在运行时错误之前,变量数据已完全创建。为什么不调用数据析构函数 另外,在这种情况下,如何确保内存不会泄漏?我认为问题在于您的异常是未捕获的,并且正在由terminate处理程序处理。由于没有catch来处理异常,编译器无法知道要“展开”多少。如果捕获到异常,则会发生破坏。如果愿意,您当然可以重新抛出它,例如: Construct a data Construct a data Construct a data Construct a data Construct a data Con

就在运行时错误之前,变量数据已完全创建。为什么不调用数据析构函数


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

我认为问题在于您的异常是未捕获的,并且正在由terminate处理程序处理。由于没有
catch
来处理异常,编译器无法知道要“展开”多少。如果捕获到异常,则会发生破坏。如果愿意,您当然可以重新抛出它,例如:

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.

你在期待什么?没有调用析构函数,因为没有捕获到
std::runtime_错误
。我希望既然数据构造完成,它的析构函数将自动调用。如何确保在发生异常时释放已分配的数据?如果从构造函数中抛出具体异常,则作用域数组可能仍有引用。理想情况下,您希望捕获此异常并进行处理,而不是放弃。事实上,我的第一条评论是错误的,对不起。问题是,您正在从构造函数中抛出。当您从构造函数中抛出时,对象未完全构造,因此不会调用它的析构函数。
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.
#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