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