#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/