Что делает удаление среднего указателя?

Действительно ли удаление является указателем то же как освобождение указателя (который выделяет память)?

10
задан Unihedron 11 August 2014 в 10:10
поделиться

7 ответов

Удаление указателя (или удаление того, на что он указывает, в качестве альтернативы) означает, что

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 ++, за исключением соображений совместимости .

13
ответ дан 3 December 2019 в 15:51
поделиться

Да, удаление указателя аналогично освобождению памяти или освобождению памяти и т. Д.

1
ответ дан 3 December 2019 в 15:51
поделиться

Да, и он вызывает соответствующий деструктор.

0
ответ дан 3 December 2019 в 15:51
поделиться

Короче говоря, да.

Но вы должны быть осторожны: если вы выделяете с помощью p = new sometype () , только тогда вам следует использовать delete p . Если вы выделяете с помощью p = sometype [count] , всегда используйте delete [] p

И еще одно: никогда не следует объединять malloc / delete или новое / бесплатное .

0
ответ дан 3 December 2019 в 15:51
поделиться

Да, delete используется для освобождения памяти и вызова деструктора для задействованного объекта.

Обычно после удаления указатель устанавливается на NULL , чтобы избежать недопустимых указателей:

Object *o = new Object();

// use object
delete o; // call o->~Object(), then releases memory
o = NULL;

Когда new и delete используются со стандартными Типы C в исходном коде C ++ они ведут себя как malloc и free .

2
ответ дан 3 December 2019 в 15:51
поделиться

Вы не можете «удалить» переменную-указатель, только установите для них значение NULL (или 0).

1
ответ дан 3 December 2019 в 15:51
поделиться

Вы не можете "удалить" переменную указателя

Конечно, можете ;-)

int** p = new int*(new int(42));
delete *p;
delete p; // <--- deletes a pointer

Но серьезно, delete действительно должен называться delete_what_the_following_pointer_points_to.

10
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: