4 / 4 / 1
Регистрация: 18.08.2008
Сообщений: 73
|
|
1 | |
Удаление динамической памяти28.10.2008, 08:45. Показов 8739. Ответов 18
Метки нет (Все метки)
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи запущенной много раз, она так и не зависла. Для большей уверенности я поставил галочку release и запускал её не через F5, а через exe-файл. Получается, что в C++ есть сборщик мусора?
P.S. Пользуюсь Visual Studio 2008.
0
|
28.10.2008, 08:45 | |
Ответы с готовыми решениями:
18
Удаление динамической памяти Удаление new из динамической памяти Удаление структуры из динамической памяти Удаление вектора из области динамической памяти. |
118 / 12 / 3
Регистрация: 21.08.2007
Сообщений: 222
|
|
28.10.2008, 09:14 | 2 |
А почему вы решили, что программа должна зависать? ОС сама подчистит память по завершении работы программы. А сборщика в С++ нет никакого, если имеется ввиду unmanaged C++.
1
|
4 / 4 / 1
Регистрация: 18.08.2008
Сообщений: 73
|
|
28.10.2008, 10:03 [ТС] | 3 |
Просто меня книга настращала (Джесс Либерти, Брэдли Джонс, "С++ за 21 день"). Там было написано, что если данные не удалены из динамической памяти с помощью delete, то до выключения компьютера они так и будут там храниться.
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
28.10.2008, 10:36 | 4 |
Читай меньше всяких глупостей "за 21 день".
0
|
4 / 4 / 1
Регистрация: 18.08.2008
Сообщений: 73
|
|
28.10.2008, 12:24 [ТС] | 6 |
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
0
|
4 / 4 / 1
Регистрация: 18.08.2008
Сообщений: 73
|
||||||
28.10.2008, 12:41 [ТС] | 8 | |||||
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
28.10.2008, 13:06 | 9 |
Нет, не все равно.
Во-первых, есть гарантия, что память нормально освободится. Не будет сюрпризов. Во-вторых, если будут сюрпризы (например, ты выйдешь за область памяти), то по завершении программа может вывалить ошибку запросто. Как ты этот случай собираешься обрабатывать без явного удаления? В-третьих, как насчет нормального вызова деструктора(ов)? В-четвертых, как насчет не полагаться на то, что система все сделает гут? Если ты можешь сам все сделать, то зачем на авось полагаться? Не сваливай на систему, что лучше делать самой программе.
1
|
2 / 2 / 1
Регистрация: 23.10.2008
Сообщений: 27
|
||||||
28.10.2008, 13:26 | 10 | |||||
1
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
28.10.2008, 13:50 | 11 |
Ты хоть думаешь, что пишешь? Бред просто наиполнейший. Самая первая строка даже как будто к объекту обращаешься...пипец... Откуда там какой lingth (length) возьмется. Кошмар.
Я не говорю, про то, что там не массив создается из указателей и твой код вообще работать не будет. Там и есть один "объект", а не то, что ты написал. Если не уверен, не стоит писать такой мусор...
0
|
118 / 12 / 3
Регистрация: 21.08.2007
Сообщений: 222
|
|
28.10.2008, 14:58 | 12 |
0
|
2 / 2 / 1
Регистрация: 23.10.2008
Сообщений: 27
|
|
28.10.2008, 22:46 | 14 |
твои колменты справедливы по поводу что я обращяюсь не к обьекте но хотелось сделать более наглядней кто не первый раз открыл с++ поймет
0
|
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
|
|
28.10.2008, 23:50 | 15 |
Мля, опять же, прочитал его высказывание, с ходу не прорубился... По моему, у кого то по русскому отметко было ниже плинтуса.
0
|
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
29.10.2008, 09:22 | 16 |
товарищи, пошел уже оффтоп, хотите посмаковать тот замысловатый код - новую тему создайте... еще есть кому чего по удалению динамической памяти добавить? иначе пора уже тему прикрывать... а код в раздел юмора нужно перенести...
0
|
4 / 4 / 0
Регистрация: 17.05.2009
Сообщений: 27
|
|
17.05.2009, 16:51 | 17 |
Код
for(inr i=0;i<s.lingth;i++){ delete [i] s; }
0
|
17.05.2009, 17:25 | 18 |
А книга в каком году была написана? Может быть в дремучие времена, когда были только однозадачные операционные ситемы? В этом случае такое ещё могло произойти.
Хорошим стилем программирования является удаление всей динамической памяти, которую ты использовал. В случае простых коротеньких программ скорее всего ничего не произойдёт, даже если ты вообще не будешь освобождать динамическую память. Однако есть тонкие моменты. После того, как отработала процедура main - программа ещё НЕ завершила свою работу. В этом месте начинает работать завершающий код, который сбрасывает все буфферизированные потоки в файлы (если файлы ещё не закрыты), вызываются деструкторы, может ещё какие-то действия. И в момент этих действий может случиться так, что понадобится дополнительная память (мало ли что там может быть написано в деструкторе) и если случится так, что именно в этом месте свободной памяти не окажется, то может получиться, что в какой-нибудь файл данные допишутся не до конца или случится ещё какое-нибудь безобразие. Если много выделать памяти, но её не освобождать, то это доплнительная нагрузка на всю машину. ОС не знает, что ты эту память не используешь, а потому держит её, занимая при этом либо физическую память, либо дисковое пространство под swap
0
|
181 / 33 / 7
Регистрация: 29.10.2008
Сообщений: 283
|
|
17.05.2009, 18:19 | 19 |
CheshireCat, книга хорошая, просто он не так чтото понял.
0
|
17.05.2009, 18:19 | |
17.05.2009, 18:19 | |
Помогаю со студенческими работами здесь
19
Удаление объекта, созданного в динамической памяти Выделение и удаление памяти, выделенной для динамической строки Не могу понять причину ошибки (связано с выделением динамической памяти под двумерный массив и ее удаление) Освобождение динамической памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |