Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2014, 11:42   #1
exelim
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 37
По умолчанию Нужно ли использовать delete ?

Добрый день. У меня такой вопрос: если мы в функции ( обычной или в методе класса ) выделяем память:
Код:
voif f()
{
int *i = new int; //int *i = new int[10] либо так
}
Нужно ли писать тут оператор delete либо же память будет автоматически освобождена по выходу из функции ?
exelim вне форума Ответить с цитированием
Старый 03.09.2014, 11:50   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Память, выделенную через new, нужно всегда удалять явно.
Не забывайте, что для массивов нужно использовать delete [].
waleri вне форума Ответить с цитированием
Старый 03.09.2014, 19:17   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от exelim Посмотреть сообщение
Нужно ли писать тут оператор delete либо же память будет автоматически освобождена по выходу из функции ?
Не обязательно.

Но если вы явно не освободите явно выделенную память - получите утечку памяти.
_Bers вне форума Ответить с цитированием
Старый 03.09.2014, 19:35   #4
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Если в функции выделена память оператором new и не освобождена delete, то происходит утечка памяти. То есть она не будет освобождена автоматически при выходе из функции.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 03.09.2014, 19:37   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Если в функции выделена память оператором new и не освобождена delete, то происходит утечка памяти. То есть она не будет освобождена автоматически при выходе из функции.
Ну почему сразу утечка... я же могу освободить память в другом месте...
rrrFer вне форума Ответить с цитированием
Старый 03.09.2014, 19:50   #6
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Ну почему сразу утечка... я же могу освободить память в другом месте...
В другом месте удалить не получится, так как указатель утерян после выхода из функции в примере автора этой темы
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 03.09.2014, 22:06   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

exelim

Нужно ли писать тут оператор delete либо же память будет автоматически освобождена по выходу из функции ?

при программировании на "си с классами" (как у тебя) - нужно
в современном c++ - не нужно.
Rififi вне форума Ответить с цитированием
Старый 04.09.2014, 12:50   #8
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Да - программа будет работать если не освободить память в этой функции. Но авторитетные авторы книг, все же призывают к тому, что количество операторов new должно быть равно количеству операторов delete. Это как хороший тон в программировании. Тем более, что память у вас выделяется не в главной функции, а в той, что вы самостоятельно создали.
Как правильно заметил challengerr ("В другом месте удалить не получится, так как указатель утерян после выхода из функции"), и мы уже не сможем обратиться к этой памяти из другого места в программе, чтобы её освободить.
marenko.lilia вне форума Ответить с цитированием
Старый 04.09.2014, 15:43   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да - программа будет работать если не освободить память в этой функции
если работать долго, то рано или поздно упадет по Out Of Memory.
да и 64-битная прога сильно подорвет работу системы.
(наблюдал в чужой проге утечку, заметил когда прога сожрала 16ГБ оперативки, ибо стало неуютно работать)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.09.2014, 16:19   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
если работать долго, то рано или поздно упадет по Out Of Memory.
Ну... не всегда так. Упадет если функция будет часто вызываться.
А так... классический пример - паттерн синглтон. Память может вообще не освобождаться, но это не создает проблему, т.к. выделена она будет лишь один раз, при первом обращении к объекту.

Короче если такая функция вызывается редко, то падения можно ждать долго. Ну а лучше взять какой-нибудь valgrind и проверить все .
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Когда нужно использовать ООП? leklerk Общие вопросы по программированию, компьютерный форум 49 01.06.2012 09:09
задача в паскаль. нужно использовать оператор выбора Наталья Николаевна Паскаль, Turbo Pascal, PascalABC.NET 1 19.02.2012 13:32
Нужно удалить указатель на массив - на строке с delete вылетает Debug Error. ImmortalAlexSan Общие вопросы C/C++ 18 07.06.2011 17:49
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14