Что означает удаление указателя? - PullRequest
10 голосов
/ 15 марта 2010

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

Ответы [ 7 ]

13 голосов
/ 15 марта 2010

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

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

10 голосов
/ 15 марта 2010

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

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

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

А если серьезно, delete действительно нужно назвать delete_what_the_following_pointer_points_to.

2 голосов
/ 15 марта 2010

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

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

Object *o = new Object();

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

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

1 голос
/ 15 марта 2010

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

1 голос
/ 15 марта 2010

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

0 голосов
/ 15 марта 2010

Короче, да.

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

И еще одна вещь: вы никогда не должны соединяться malloc/delete или new/free.

0 голосов
/ 15 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...