QScopedArrayPointer защищает мои данные, но они все еще подтекают - PullRequest
2 голосов
/ 12 апреля 2011
#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_ не вызывается?

Кроме того, как я могу убедиться, что память не протекает в этом случае?

1 Ответ

2 голосов
/ 12 апреля 2011

Я думаю, что проблема в том, что ваше исключение не обработано и обрабатывается обработчиком завершения.Поскольку нет 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
...