При использовании delete не остаётся ли висячей ссылки? После этого не нужно указатель ставить в NULL?
Пример:
int* pointer=new int;
delete pointer;
//pointer=NULL; <--- нужна ли эта строчка?
C/C++
Простой вопрос про динамическую память, new/delete, C++
ссылка остается, но просто ей не пользуйтесь и тогда обнулять не нужно. Хуже от обнуления не будет
Нет, не остается... Вернее она остается, но доступна для использования и под любые типы данных
Каждый раз при использовании указателя его следует проверять на валидность. Например,
void print(int* ptr, const size_t length) {
if (ptr != nullptr) {
for (auto i = 0U; i < length; ++i) std::cout << ptr[i] << ' ';
puts("");
}
}
Если передать в функцию указатель, которому после освобождения памяти не был присвоен nullptr, вы получите ошибку времени выполнения связанную с нарушением доступа для чтения либо записи.
void fn(int* ptr) {
if (ptr != nullptr) *ptr = 8; // ошибка записи
}
// TODO:
auto ptr = new int;
delete ptr;
fn(ptr); // передача в функцию «битого» указателя
void print(int* ptr, const size_t length) {
if (ptr != nullptr) {
for (auto i = 0U; i < length; ++i) std::cout << ptr[i] << ' ';
puts("");
}
}
Если передать в функцию указатель, которому после освобождения памяти не был присвоен nullptr, вы получите ошибку времени выполнения связанную с нарушением доступа для чтения либо записи.
void fn(int* ptr) {
if (ptr != nullptr) *ptr = 8; // ошибка записи
}
// TODO:
auto ptr = new int;
delete ptr;
fn(ptr); // передача в функцию «битого» указателя
#include < iostream >
using namespace std;
int main(int argc, char** argv)
{
int* pointer = new int;
cout << pointer << endl;
delete pointer;
pointer = 0; // если так, то норм, а иначе вылет в ошибку, вот и делай сам выводы
cout << pointer << endl;
delete pointer;
return 0;
}
using namespace std;
int main(int argc, char** argv)
{
int* pointer = new int;
cout << pointer << endl;
delete pointer;
pointer = 0; // если так, то норм, а иначе вылет в ошибку, вот и делай сам выводы
cout << pointer << endl;
delete pointer;
return 0;
}
Ничего не остается.
Твои new/delete используют парные аллокатор/деаллокатор. Если ты не переопределишь случайно их непарно, то никаких утечек и крашей не будет (ну, если считать, что память выделилась успешно, никакие bad_alloc не полетели).
Ну а сам указатель при вызове delete не изменится, так что если тебе нужно его проверять потом на валидность, обнуляй.
Твои new/delete используют парные аллокатор/деаллокатор. Если ты не переопределишь случайно их непарно, то никаких утечек и крашей не будет (ну, если считать, что память выделилась успешно, никакие bad_alloc не полетели).
Ну а сам указатель при вызове delete не изменится, так что если тебе нужно его проверять потом на валидность, обнуляй.
Не нужна.
Делит освобождает выделенную память под ссылку.
Делит освобождает выделенную память под ссылку.
Похожие вопросы
- Ошибка в динамическом массиве new[] и delete[] |С++ Builder
- Как разработать динамические переменные с помощью оператора new и при этом удалены оператором delete C++? Можно пример?
- C++ и динамическая память: это приемлемо?
- Если приложение вызывает утечку памяти, то при завершение работы приложения динамическая память очиститься или нет?
- Задачи по динамической памяти. C++
- Помогите с динамической памятью C++
- С++ выделение памяти new
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Можно через delete [ ] ? c++ помогите пожалуйста!
- Какие отличия(простыми словами) в языках программирования Java и C++? Что лучше изучать. У какого больше возможностей?