Можно ли удалить C POD с помощью delete в C++?


Имеющие структуры типа

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 3

3 ответа:

Удаление структурыне рекурсивно удаляет все указатели в ней, и, следовательно, не освобождает массив символов, на который указывает 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);

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

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

Если вы выполняете свою функцию 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; они помогут вам в правильном управлении памятью.