Действительно ли удаление является указателем то же как освобождение указателя (который выделяет память)?
Удаление указателя (или удаление того, на что он указывает, в качестве альтернативы) означает, что
delete p;
delete[] p; // for arrays
p
был выделен до этого оператора, например
p = new type;
. Это также может относиться к использованию других способов управления динамической памятью, например ] free
free(p);
, который ранее был выделен с помощью malloc или calloc
p = malloc(size);
. Последнее чаще называют «освобождением», а первое - «удалением». delete
используется для классов с деструктором, поскольку delete
вызовет деструктор в дополнение к освобождению памяти. free
(и malloc, calloc и т. Д.) Используется для базовых типов, но в C ++ new и delete также могут использоваться для них, поэтому нет особых причин использовать malloc в C ++, за исключением соображений совместимости .
Да, удаление указателя аналогично освобождению памяти или освобождению памяти и т. Д.
Короче говоря, да.
Но вы должны быть осторожны: если вы выделяете с помощью p = new sometype ()
, только тогда вам следует использовать delete p
. Если вы выделяете с помощью p = sometype [count]
, всегда используйте delete [] p
И еще одно: никогда не следует объединять malloc / delete
или новое / бесплатное
.
Да, delete
используется для освобождения памяти и вызова деструктора для задействованного объекта.
Обычно после удаления указатель устанавливается на NULL
, чтобы избежать недопустимых указателей:
Object *o = new Object();
// use object
delete o; // call o->~Object(), then releases memory
o = NULL;
Когда new
и delete
используются со стандартными Типы C в исходном коде C ++ они ведут себя как malloc
и free
.
Вы не можете «удалить» переменную-указатель, только установите для них значение NULL (или 0).
Вы не можете "удалить" переменную указателя
Конечно, можете ;-)
int** p = new int*(new int(42));
delete *p;
delete p; // <--- deletes a pointer
Но серьезно, delete
действительно должен называться delete_what_the_following_pointer_points_to
.