Можно ли удалить C POD, используя delete в C ++? - PullRequest
3 голосов
/ 23 января 2011

Имея такие структуры, как

struct ifoo_version_42 {
   int x, y, z;
   char *imageData;
};

, где imageData это что-то вроде imageData = new char[50000];

Можем ли мы выполнить что-то вроде:

template< typename T >
void del( T a ) // we promise to use this only on C Plain Old data structs=)
{
  delete a;
}

для этой структуры иДостаточно ли будет очистить форму памяти, если?

Ответы [ 3 ]

5 голосов
/ 23 января 2011

Удаление структуры не рекурсивно удаляет все указатели в ней и, следовательно, не освобождает массив char, на который указывает imageData.

Я также немного озадачен вашим использованием delete[]. Вы можете освободить массив (выделенный с помощью new[]), используя delete[], или освободить отдельный объект (выделенный с помощью new), используя delete. Вы не можете смешивать их, и вы не говорите, как выделяете один или несколько экземпляров ifoo_version_42. Например, следующее имеет неопределенное поведение:

ifoo_version_42 *x = new ifoo_version_42;
del(x);

Все в порядке:

ifoo_version_42 *x = new ifoo_version_42[1];
del(x);
5 голосов
/ 23 января 2011

Этот шаблон функции также будет «работать» с не POD-типами. Это буквально ничем не отличается от прямого вызова delete[] a;.

Однако это не удалит память, связанную с imageData. Обычно это то, что вы делаете в деструкторе.

3 голосов
/ 23 января 2011

Если вы выполняете функцию del на ifoo_version_42, то блок памяти, на который указывает data, не будет освобожден; ни delete, ни delete[] не работают рекурсивно.

delete[] предназначен для освобождения arrays; то есть, если вы присвоили imageData с new[], то он должен быть освобожден с помощью delete[].

delete предназначен для освобождения отдельных объектов: если вы, например, выделил ifoo_version_42 с new, затем вы должны освободить его с delete.

(Кроме того, никогда не используйте delete для чего-то, выделенного с malloc(), или free() с чем-то, выделенного с new.)

Еще одно предложение: Изучите идиому RAII и используйте классы интеллектуальных указателей, предоставляемые библиотеками STL или Boost; это поможет вам правильно управлять памятью.

...