Valgrind жалуется на строку с новым (первым):
#ifndef MAXI_BUF_SIZE
#define MAXI_BUF_SIZE 2*8192
#endif
if (lg_maxi_buf == NULL)
{
lg_maxi_buf = new unsigned char[MAXI_BUF_SIZE] ;
}
else
{
delete [] lg_maxi_buf ;
lg_maxi_buf = NULL ;
lg_maxi_buf = new unsigned char[MAXI_BUF_SIZE] ;
}
Я хотел объяснить, что поле lg_maxi_buf
является частью класса Audio_decoder и объявлен так:
unsigned char *lg_maxi_buf;
в конструкторе класса Audio_decoder lg_maxi_buf
инициализируется следующим образом:
lg_maxi_buf = NULL;
Спасибо за ваши ответы. Я думаю, что мне придется использовать умные указатели, но мои знания о них очень скудны.
Вы могли бы упростить свой if-else в
delete [] lg_maxi_buf ;
lg_maxi_buf = new unsigned char[MAXI_BUF_SIZE] ;
Оператор удаления игнорирует NULL-параметры (вы избегаете многих if
так.
Я лично не влияю на NULL до нового, но я понимаю, если вы предпочитаете.
Чтобы инициализировать этот блок памяти, просто добавьте круглые скобки:
lg_maxi_buf = new unsigned char[MAXI_BUF_SIZE]();
Других решений пока нет …