0

这是我编写的代码:

class sCircBuffer
{
    public:
        sCircBuffer(void);
        ~sCircBuffer(void);
        double *Data;
        int Size;
        bool Init(int SizeBuffer);
        bool Delete();
}

sCircBuffer :: sCircBuffer(void) //Constructor
{
    Data=NULL; //Initialize input circular buffer
}

sCircBuffer :: ~sCircBuffer(void) //Destructor
{
    delete [] Data; //Initialize input circular buffer
    Data=NULL;
}

bool sCircBuffer :: Init(int SizeBuffer)
{
    delete [] Data; //Initialize input circular buffer
    Data=new double [SizeBuffer]; //Initialize input circular buffer    
    Size=SizeBuffer;
    for (int i=0; i<Size; i++)
        Data[i]=0;
    return true;
}

bool sCircBuffer :: Delete()
{
    delete [] Data; //Initialize input circular buffer
    Data=NULL;
    return true;
}

我正在另一个类中创建上述类的对象:

class PerChannel
{
    public:
        PerChannel();
        ~PerChannel();

        sCircBuffer m_InputDataRaw;
}

PerChannel :: PerChannel()
{
    m_InputDataRaw.Init(MAX_NUM_TO_FETCH); // MAX_NUM_TO_FETCH = 1000
}

PerChannel :: ~PerChannel()
{
    m_InputDataRaw.Delete();
}

在 Coverity 和 C++ Memory Validator 中,我在 PerChannel 的构造函数中遇到资源泄漏错误。

我不确定这里有什么问题?

非常感谢您的帮助。

钦坦

4

3 回答 3

1

在你的init方法中sCircbuffer尝试delete []一个指向 NULL 的指针。

于 2013-07-23T14:38:25.120 回答
0

如果我是你,我肯定会改变类接口,例如通过定义如下构造函数:

sCircBuffer(int size = SOME_USEFUL_VALUE);

并在其中分配我的初始缓冲区。让我说 Delete() 方法是一个可怕的想法:您应该简单地在 Init() 方法中处理删除(例如,我将其称为 Resize())。让你的类的用户删除内部缓冲区......嗯,它只是破坏了面向对象设计的全部内容。

无论如何,如果您不想在保持代码不变时遇到麻烦,您至少应该在构造函数中添加以下几行:

Size= 0;
Data= new double [Size];

但我仍然相信将其初始化为有意义的大小将是一个更好的解决方案。

于 2013-07-23T14:59:39.390 回答
0

首先,不清楚 m_InputDataTelem 是什么,因为您已将 m_InputDataRaw 指定为类中的循环缓冲区,而不是 m_InputDataTelem。

到目前为止,您正在调用 init,而没有先构造 sCircBuffer,因此试图删除尚未初始化的缓冲区(访问冲突)。

于 2013-07-23T14:39:00.847 回答