QScopedArrayPointer保护我的数据,但它仍然在泄漏
QScopedArrayPointer guarding my data but it is still leaking
#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_destructor ?
另外,我如何确保内存不泄漏在这种情况下?
我认为问题是您的异常未被捕获并且正在由终止处理程序处理。由于没有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
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么在保护模式下继承升级不起作用
- 访问被拒绝后,c++中的故障保护代码
- C++:无法访问声明的受保护成员
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 为什么您需要C++头文件的包含保护
- 这个极客对极客的trie实现是否存在内存泄漏问题
- lock_guard是否保护返回值
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- 继承和友元函数,从基类访问受保护的成员
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- QScopedArrayPointer保护我的数据,但它仍然在泄漏