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函数多少次?@chintans
std::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*.
};