Можно ли удалить 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; они помогут вам в правильном управлении памятью.