Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.81
leviaphan
4 / 4 / 0
Регистрация: 18.08.2008
Сообщений: 73
#1

Удаление динамической памяти - C++

28.10.2008, 08:45. Просмотров 3451. Ответов 18
Метки нет (Все метки)

В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи запущенной много раз, она так и не зависла. Для большей уверенности я поставил галочку release и запускал её не через F5, а через exe-файл. Получается, что в C++ есть сборщик мусора?
P.S. Пользуюсь Visual Studio 2008.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igor_nf
118 / 12 / 1
Регистрация: 21.08.2007
Сообщений: 222
28.10.2008, 09:14     Удаление динамической памяти #2
Цитата Сообщение от leviaphan Посмотреть сообщение
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи запущенной много раз, она так и не зависла. Для большей уверенности я поставил галочку release и запускал её не через F5, а через exe-файл. Получается, что в C++ есть сборщик мусора?
P.S. Пользуюсь Visual Studio 2008.
А почему вы решили, что программа должна зависать? ОС сама подчистит память по завершении работы программы. А сборщика в С++ нет никакого, если имеется ввиду unmanaged C++.
leviaphan
4 / 4 / 0
Регистрация: 18.08.2008
Сообщений: 73
28.10.2008, 10:03  [ТС]     Удаление динамической памяти #3
Цитата Сообщение от igor_nf Посмотреть сообщение
А почему вы решили, что программа должна зависать? ОС сама подчистит память по завершении работы программы. А сборщика в С++ нет никакого, если имеется ввиду unmanaged C++.
Просто меня книга настращала (Джесс Либерти, Брэдли Джонс, "С++ за 21 день"). Там было написано, что если данные не удалены из динамической памяти с помощью delete, то до выключения компьютера они так и будут там храниться.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
28.10.2008, 10:36     Удаление динамической памяти #4
Читай меньше всяких глупостей "за 21 день".
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 12:20     Удаление динамической памяти #5
CheshireCat, +1

leviaphan, хранится могут. Только на них что угодно можно записать. Это место не будет занято, так как, процесс умер. А что там он в памяти оставил всем остальным уже пофигу.
leviaphan
4 / 4 / 0
Регистрация: 18.08.2008
Сообщений: 73
28.10.2008, 12:24  [ТС]     Удаление динамической памяти #6
Цитата Сообщение от Vourhey Посмотреть сообщение
CheshireCat, +1

leviaphan, хранится могут. Только на них что угодно можно записать. Это место не будет занято, так как, процесс умер. А что там он в памяти оставил всем остальным уже пофигу.
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 12:31     Удаление динамической памяти #7
Цитата Сообщение от leviaphan Посмотреть сообщение
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
delete надо использовать там, где нужно освободить память. Где это в программе ты будешь делать - дело твое.
leviaphan
4 / 4 / 0
Регистрация: 18.08.2008
Сообщений: 73
28.10.2008, 12:41  [ТС]     Удаление динамической памяти #8
delete надо использовать там, где нужно освободить память. Где это в программе ты будешь делать - дело твое.
Я наверное не так объяснил... Например, есть код:

C++
1
2
3
4
5
6
7
8
#include <iostream>
int main()
{
   char* s = new char [100];
   // тут мы что-то делаем со строкой
   delete [] s; /* как я понял из ваших слов, всё равно, есть эта строчка или нет, потому что память, выделенная для s, и без delete сможет быть использована другими программами? всё равно именно в этом конретном случае, когда оператор delete размещён сразу перед завершением программы? */
   return 0;
}
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 13:06     Удаление динамической памяти #9
Нет, не все равно.
Во-первых, есть гарантия, что память нормально освободится. Не будет сюрпризов.
Во-вторых, если будут сюрпризы (например, ты выйдешь за область памяти), то по завершении программа может вывалить ошибку запросто. Как ты этот случай собираешься обрабатывать без явного удаления?
В-третьих, как насчет нормального вызова деструктора(ов)?
В-четвертых, как насчет не полагаться на то, что система все сделает гут? Если ты можешь сам все сделать, то зачем на авось полагаться? Не сваливай на систему, что лучше делать самой программе.
dint
2 / 2 / 0
Регистрация: 23.10.2008
Сообщений: 27
28.10.2008, 13:26     Удаление динамической памяти #10
Я наверное не так объяснил...
вобщем это он удалит обин обьект а надо создать
C++
1
2
3
for(inr i=0;i<s.lingth;i++){
delete [i] s;
}
а пото вот тот код, это если под массивы а подж статически обьекты просто delete
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 13:50     Удаление динамической памяти #11
Цитата Сообщение от dint Посмотреть сообщение
вобщем это он удалит обин обьект а надо создать
for(inr i=0;i<s.lingth;i++){
delete [i] s;
}
а пото вот тот код, это если под массивы а подж статически обьекты просто delete
Ты хоть думаешь, что пишешь? Бред просто наиполнейший. Самая первая строка даже как будто к объекту обращаешься...пипец... Откуда там какой lingth (length) возьмется. Кошмар.
Я не говорю, про то, что там не массив создается из указателей и твой код вообще работать не будет. Там и есть один "объект", а не то, что ты написал.
Если не уверен, не стоит писать такой мусор...
igor_nf
118 / 12 / 1
Регистрация: 21.08.2007
Сообщений: 222
28.10.2008, 14:58     Удаление динамической памяти #12
Цитата Сообщение от dint Посмотреть сообщение
вобщем это он удалит обин обьект а надо создать
for(inr i=0;i<s.lingth;i++){
delete [i] s;
}
а пото вот тот код, это если под массивы а подж статически обьекты просто delete
Пробовал перечитать сам текст, не обращая внимания на код - ниасилил.
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 15:00     Удаление динамической памяти #13
я вообще забил на текст чисто интуитивно
Честно сказать, я даже не сразу сообразил, что это вообще С++
dint
2 / 2 / 0
Регистрация: 23.10.2008
Сообщений: 27
28.10.2008, 22:46     Удаление динамической памяти #14
Цитата Сообщение от Vourhey Посмотреть сообщение
Ты хоть думаешь, что пишешь? Бред просто наиполнейший. Самая первая строка даже как будто к объекту обращаешься...пипец... Откуда там какой lingth (length) возьмется. Кошмар.
Я не говорю, про то, что там не массив создается из указателей и твой код вообще работать не будет. Там и есть один "объект", а не то, что ты написал.
Если не уверен, не стоит писать такой мусор...
твои колменты справедливы по поводу что я обращяюсь не к обьекте но хотелось сделать более наглядней кто не первый раз открыл с++ поймет
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
28.10.2008, 23:50     Удаление динамической памяти #15
Мля, опять же, прочитал его высказывание, с ходу не прорубился... По моему, у кого то по русскому отметко было ниже плинтуса.
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
29.10.2008, 09:22     Удаление динамической памяти #16
товарищи, пошел уже оффтоп, хотите посмаковать тот замысловатый код - новую тему создайте... еще есть кому чего по удалению динамической памяти добавить? иначе пора уже тему прикрывать... а код в раздел юмора нужно перенести...
Ivannumberone
4 / 4 / 0
Регистрация: 17.05.2009
Сообщений: 27
17.05.2009, 16:51     Удаление динамической памяти #17
Код
for(inr i=0;i<s.lingth;i++){
delete [i] s;
}
Мда!!! мне жалко коммпилятор в котором это напишут)))
Evg
Эксперт CАвтор FAQ
17415 / 5653 / 355
Регистрация: 30.03.2009
Сообщений: 15,478
Записей в блоге: 26
17.05.2009, 17:25     Удаление динамической памяти #18
Цитата Сообщение от leviaphan Посмотреть сообщение
Просто меня книга настращала (Джесс Либерти, Брэдли Джонс, "С++ за 21 день"). Там было написано, что если данные не удалены из динамической памяти с помощью delete, то до выключения компьютера они так и будут там храниться.
А книга в каком году была написана? Может быть в дремучие времена, когда были только однозадачные операционные ситемы? В этом случае такое ещё могло произойти.

Цитата Сообщение от leviaphan Посмотреть сообщение
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
Хорошим стилем программирования является удаление всей динамической памяти, которую ты использовал. В случае простых коротеньких программ скорее всего ничего не произойдёт, даже если ты вообще не будешь освобождать динамическую память. Однако есть тонкие моменты. После того, как отработала процедура main - программа ещё НЕ завершила свою работу. В этом месте начинает работать завершающий код, который сбрасывает все буфферизированные потоки в файлы (если файлы ещё не закрыты), вызываются деструкторы, может ещё какие-то действия. И в момент этих действий может случиться так, что понадобится дополнительная память (мало ли что там может быть написано в деструкторе) и если случится так, что именно в этом месте свободной памяти не окажется, то может получиться, что в какой-нибудь файл данные допишутся не до конца или случится ещё какое-нибудь безобразие.

Если много выделать памяти, но её не освобождать, то это доплнительная нагрузка на всю машину. ОС не знает, что ты эту память не используешь, а потому держит её, занимая при этом либо физическую память, либо дисковое пространство под swap
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2009, 18:19     Удаление динамической памяти
Еще ссылки по теме:

C++ Выделение динамической памяти
C++ Удаление динамической памяти
C++ Выделение динамической памяти
Удаление new из динамической памяти C++
C++ Освобождение динамической памяти в vs

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
17.05.2009, 18:19     Удаление динамической памяти #19
CheshireCat, книга хорошая, просто он не так чтото понял.
Yandex
Объявления
17.05.2009, 18:19     Удаление динамической памяти
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru