数组中的资源泄漏
Resource leak from an array
我有以下类:
class estimate
{
public:
estimate();
~estimate();
double *tHanning;
}
estimate::estimate()
{
tHanning = NULL;
tHanning = new double [1000];
for (int m=0; m<1000; m++)
{
tHanning[m]=(0.5-0.5*cos(2.0*PI*(m+1)/(1001)));
}
}
estimate::~estimate()
{
delete [] tHanning;
tHanning = NULL;
}
我不知道为什么当我为变量分配"new"时,C++内存验证器在构造函数中显示资源泄漏。
有人能帮帮我吗?
编辑:我如何起诉上述类别:
class HBMain
{
public:
HBMain();
~HBMain();
bool Init();
estimate *objEstimate;
}
HBMain :: HBMain()
{
objEstimate = NULL;
}
HBMain :: ~HBMain()
{
delete objEstimate;
objEstimate = NULL;
}
bool HBMain :: Init()
{
....
objEstimate = new estimate();
....
}
作为一种替代解决方案,为什么不简单地将指针更改为double向量呢?
您将避免因内存泄漏而头疼。
编辑:对于HBMain类,您还可以通过C++11或Boost库中的智能指针(shared_ptr)更改裸指针,并删除析构函数。因此,您将不必实现所有的样板代码。
但是,您真的需要对HBMain房产进行动态分配吗?
estimate
类的构造函数和析构函数似乎都很好(动态分配内存时,new[]
在构造函数中,delete[]
在析构函数中)。
但我认为您在复制期间可能会遇到问题。
事实上,您的类有默认的复制构造函数和operator=
,但在这种情况下,默认行为是不好;事实上,默认行为只是按成员复制,但复制原始指针tHanning
数据成员是一种"泄漏"。
禁用复制构造函数和operator=
(例如,在C++98/03中声明它们为private
,或使用新的= delete
C++11语法),或者为它们提供适当的实现。
正确的实现应该对所拥有的数组进行深度复制(适当删除任何以前分配的数组)。
我认为您能做的最好的事情是使用std::vector<double>
而不是原始指针。
如果您确实对std::vector
的开销(相对较小)有很大的限制,那么可以考虑使用智能指针,如std::unique_ptr
:
#include <memory> // for std::unique_ptr
class estimate
{
private:
std::unique_ptr<double[]> tHanning; // <--- SMART pointer
public:
estimate()
: tHanning(new double[1000])
{
for (int m = 0; m < 1000; m++)
{
tHanning[m] = (0.5-0.5*cos(2.0*PI*(m+1)/(1001)));
}
}
// No need to define destructor - smart pointer automatically deletes its owned stuff
};
这样,类将是可移动的,但不可复制。与原始指针情况相比,您将产生几乎为零的开销。
作为边界阅读,请考虑C++中的三规则。
同样,在HBMain
类中,不要使用原始estimate *objEstimate
指针数据成员。相反,使用智能指针,如:
class HBMain
{
....
private:
std::unique_ptr<estimate> objEstimate;
// Again, no need to define a custom destructor for deleting objEstimate.
// std::unique_ptr will do proper deletion *automatically*.
};
- 具有瞬态资源的RAII类
- valgrind-hellgrind与泄漏检查的结果不同
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 从构造函数抛出异常时如何克服内存泄漏
- Klocwork Inside的资源泄漏
- C Winsock接受内存泄漏/资源泄漏
- 资源泄漏与否(Mac OS X)
- 资源泄漏:fExclfile
- 内核资源泄漏BIO_do_connect
- 如何更正GDI资源泄漏
- 数组中的资源泄漏
- 删除运算符导致资源泄漏
- 多态性=资源泄漏中基类缺少虚拟析构函数
- 下面的代码会导致资源泄漏吗?
- 使用std::uninitialized_copy的Stroustrup示例中的资源泄漏
- 资源泄漏opengl/win32
- MFC SendMessage()中的资源泄漏
- 从RAII对象泄漏资源
- 了解c++中内存泄漏的良好资源/书籍
- 我的程序泄漏了boost::shared_ptr拥有的资源