Утечка ресурса из-за оператора удаления

Вот код, который я написал:

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

Решение

в init метод sCircbuffer Вы пытаетесь delete [] указатель, который указывает на NULL.

1

Другие решения

Прежде всего, неясно, что такое m_InputDataTelem, поскольку вы указали m_InputDataRaw как круговой буфер в классе, а не m_InputDataTelem.

На данный момент вы делаете вызов init, без предварительного создания sCircBuffer, следовательно, пытаетесь удалить буфер, который еще не был инициализирован (нарушение доступа).

0

На вашем месте я бы определенно изменил интерфейс класса, например, определив конструктор, например:

sCircBuffer (int size = SOME_USEFUL_VALUE);

и выделение моего начального буфера в нем. Позвольте мне сказать, что метод Delete () — ужасная идея: вы должны просто обработать удаление внутри вашего метода Init () (который я бы назвал, например, Resize ()). Позволяя пользователю вашего класса удалить внутренний буфер … Ну, это просто побеждает, что такое Object Oriented Design.

В любом случае, если вы не хотите, чтобы ваш код оставался в затруднительном положении, вы должны хотя бы добавить в конструктор следующие строки:

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

Но я все еще верю, что инициализация этого к значимому размеру была бы лучшим решением.

0