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