2

我有以下课程:

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++ Memory Validator 在构造函数中显示资源泄漏。

有人能帮帮我吗?

编辑:我如何起诉上述课程:

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();
    ....
}
4

2 回答 2

1

您的类的构造函数和析构函数看起来都很好(您在构造函数中estimate动态分配内存,在析构函数中分配内存)。new[]delete[]

但是我认为您在复制过程中可能会遇到问题。

实际上,您的类具有默认的复制构造函数和operator=,但在这种情况下默认行为并不好;实际上,默认行为只是按成员复制,但复制原始指针tHanning数据成员是“泄漏”。

禁用复制构造函数和operator=(例如private在 C++98/03 中声明它们,或使用新的= 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*.
};
于 2013-07-29T17:07:25.763 回答
1

作为替代解决方案,为什么不简单地通过 double 向量更改指针?

您将避免因内存泄漏而头疼的问题。

编辑:对于 HBMain 类,您还可以通过 C++11 或 Boost 库中的智能指针 (shared_ptr) 更改裸指针并删除析构函数。因此,您不必实现所有样板代码。

但是,您真的需要动态分配 HBMain 属性吗?

于 2013-07-29T14:00:22.650 回答