Будет ли этот код C ++ вызывать утечку памяти (приведение нового массива) - PullRequest
10 голосов
/ 16 сентября 2008

Я работал над некоторым устаревшим кодом C ++, который использует структуры переменной длины (TAPI), где размер структуры будет зависеть от строк переменной длины. Структуры распределяются массивом приведения new таким образом:

STRUCT* pStruct = (STRUCT*)new BYTE [sizeof(STRUCT) + nPaddingSize];

Позже, однако, память освобождается с помощью вызова delete:

delete pStruct;

Будет ли это сочетание массива new [] и не массива delete причиной утечки памяти или это будет зависеть от компилятора? Будет ли лучше изменить этот код, чтобы вместо него использовать malloc и free?

Ответы [ 24 ]

0 голосов
/ 16 сентября 2008

Всегда лучше, чтобы приобретение / выпуск любого ресурса был как можно более сбалансированным. Хотя утечка или нет трудно сказать в этом случае. Это зависит от реализации компилятором выделения вектора (de).

BYTE * pBytes = new BYTE [sizeof(STRUCT) + nPaddingSize];

STRUCT* pStruct = reinterpret_cast< STRUCT* > ( pBytes ) ;

 // do stuff with pStruct

delete [] pBytes ;
0 голосов
/ 16 сентября 2008

Вы как бы смешиваете С и С ++ способы ведения дел. Зачем выделять больше, чем размер STRUCT? Почему не просто "новая СТРУКТУРА"? Если вы должны сделать это, тогда, возможно, было бы более понятно использовать malloc и free в этом случае, поскольку тогда вы или другие программисты могли бы с меньшей вероятностью делать предположения о типах и размерах выделенных объектов.

0 голосов
/ 16 сентября 2008

Используйте оператор new и удалите:

struct STRUCT
{
  void *operator new (size_t)
  {
    return new char [sizeof(STRUCT) + nPaddingSize];
  }

  void operator delete (void *memory)
  {
    delete [] reinterpret_cast <char *> (memory);
  }
};

void main()
{
  STRUCT *s = new STRUCT;
  delete s;
}
0 голосов
/ 16 сентября 2008

Len: проблема в том, что pStruct является STRUCT *, но выделенная память фактически является байтом [] некоторого неизвестного размера. Поэтому delete [] pStruct не будет выделять всю выделенную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...