Вот код, который я написал:
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
в init
метод sCircbuffer
Вы пытаетесь delete []
указатель, который указывает на NULL.
Прежде всего, неясно, что такое m_InputDataTelem, поскольку вы указали m_InputDataRaw как круговой буфер в классе, а не m_InputDataTelem.
На данный момент вы делаете вызов init, без предварительного создания sCircBuffer, следовательно, пытаетесь удалить буфер, который еще не был инициализирован (нарушение доступа).
На вашем месте я бы определенно изменил интерфейс класса, например, определив конструктор, например:
sCircBuffer (int size = SOME_USEFUL_VALUE);
и выделение моего начального буфера в нем. Позвольте мне сказать, что метод Delete () — ужасная идея: вы должны просто обработать удаление внутри вашего метода Init () (который я бы назвал, например, Resize ()). Позволяя пользователю вашего класса удалить внутренний буфер … Ну, это просто побеждает, что такое Object Oriented Design.
В любом случае, если вы не хотите, чтобы ваш код оставался в затруднительном положении, вы должны хотя бы добавить в конструктор следующие строки:
Size= 0;
Data= new double [Size];
Но я все еще верю, что инициализация этого к значимому размеру была бы лучшим решением.