数组中的资源泄漏

Resource leak from an array

本文关键字:泄漏 资源 数组      更新时间:2023-10-16

我有以下类:

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,或使用新的= deleteC++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*.
};