C++ 来自阵列的资源泄漏
我有以下课程:C++ 来自阵列的资源泄漏,c++,visual-c++,memory-management,memory-leaks,C++,Visual C++,Memory Management,Memory Leaks,我有以下课程: 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
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;
}
作为另一种解决方案,为什么不简单地将指针更改为double向量呢 您将避免因内存泄漏而头痛 编辑:对于HBMain类,您还可以通过C++11或Boost库中的智能指针(shared_ptr)更改裸指针,并删除析构函数。因此,您不必实现所有的样板代码
但是,您真的需要为HBMain属性动态分配吗?您的
估计值
类的构造函数和析构函数似乎都很好(您在构造函数中使用new[]
动态分配内存,在析构函数中使用delete[]
动态分配内存)
但我认为您在复制过程中可能会遇到问题
事实上,您的类有默认的复制构造函数和操作符=
,但在这种情况下,默认行为并不好;事实上,默认行为只是按成员复制,但复制原始指针tHanning
数据成员是一种“泄漏行为”
禁用复制构造函数和运算符=
(例如,在C++98/03中声明它们为私有
,或者使用新的=delete
C++11语法),或者为它们提供适当的实现
正确的实现应该对所拥有的阵列进行深度复制(适当删除以前分配的任何阵列)
我认为最好的方法是使用std::vector而不是原始指针
如果您对代码(>代码:STD::vector < /代码>)的(相对较小)开销非常严格,那么考虑使用像“代码> STD::UNQuYGYPPTR <代码> >:的智能指针。
#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
};
请发布准确的错误消息。另外,如何创建
estimate
的实例?如何使用estimate
类?您可能想了解一下。这就是为什么建议使用std::vector
而不是手动内存管理。您调用init函数多少次?@chintansstd::vector
消耗的内存不超过相同大小的double
数组。它的优点是您不必担心手动管理内存。它的缺点是。。。好。。。我真的不知道。我脑子里想不出什么了。非常感谢。如果我使用vector::double,它不会占用更多的内存吗?是的,会占用更多的内存,而且速度也会慢一些。但是你必须记住C++是非常快的,所以对于绝大多数代码来说,这不是什么大不了的事情。优点:无内存泄漏头痛,这是一个巨大的优势。这和智能指针一样。再次感谢。让我把所有的指针转换成向量,看看需要多少内存。干杯。当然,您不必实现样板代码。您只需将tHanning更改为向量。就目标而言,它将是一个共享的ptr。如果您不能使用C++11,您仍然可以使用Boost库使用智能指针。非常感谢您的回复。使用数字1000只是一个例子。如何在构造函数中修改代码,从另一个计算中获得大小?再次感谢,不客气。对于您的新问题:您可以使用unique\u ptr::reset()
方法,类似这样的方法:const int count=GetProperSize();重置(新的双[计数])代码>。再次感谢您的回复。那么,我是否应该做与上面相同的操作,如果想改变代码中的其他地方的大小?我确实做了和上面一样,C++内存验证程序仍然认为它泄漏内存:
#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
};
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*.
};