这是我写的代码:
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的构造函数中遇到资源泄漏错误。
我不确定这里有什么问题?
非常感谢您的帮助。
Chintan
答案 0 :(得分:1)
在init
的{{1}}方法中,您尝试sCircbuffer
指向NULL的指针。
答案 1 :(得分:0)
首先,不清楚m_InputDataTelem是什么,因为您已将m_InputDataRaw指定为类中的循环缓冲区,而不是m_InputDataTelem。
截至目前,您正在调用init,而不首先构造sCircBuffer,因此尝试删除尚未初始化的缓冲区(访问冲突)。
答案 2 :(得分:0)
如果我是你,我会定义类接口,例如通过定义一个构造函数:
sCircBuffer(int size = SOME_USEFUL_VALUE);
并在其中分配我的初始缓冲区。让我说Delete()方法是一个可怕的想法:你应该简单地处理你的Init()方法中的删除(例如我称之为Resize())。让你的类的用户删除内部缓冲区...好吧,它只是失败了面向对象设计的全部内容。
无论如何,如果你不想让你的代码保持原样,那么你至少要在构造函数中添加这些代码:
Size= 0;
Data= new double [Size];
但我仍然认为将其初始化为有意义的大小将是一个更好的解决方案。