4 / 4 / 1
Регистрация: 18.08.2008
Сообщений: 73
1

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

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

Author24 — интернет-сервис помощи студентам
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи запущенной много раз, она так и не зависла. Для большей уверенности я поставил галочку release и запускал её не через F5, а через exe-файл. Получается, что в C++ есть сборщик мусора?
P.S. Пользуюсь Visual Studio 2008.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2008, 08:45
Ответы с готовыми решениями:

Удаление динамической памяти
Всем здрасьте. Имеется вот такая структура. struct ModelType { DWORD FVF;...

Удаление new из динамической памяти
Здравствуйте, у меня есть следующее присвоение: sign->numb = new int; Мне нужно от него...

Удаление структуры из динамической памяти
struct aTapeElement { char Operator; float Operand; aTapeElement *NextElement; }; Это...

Удаление вектора из области динамической памяти.
Всем привет! Прошу разъяснить. Как правильно удалить содержимое вектора? class Coordinate {...

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

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

leviaphan, хранится могут. Только на них что угодно можно записать. Это место не будет занято, так как, процесс умер. А что там он в памяти оставил всем остальным уже пофигу.
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.10.2008, 12:31 7
Цитата Сообщение от leviaphan Посмотреть сообщение
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
delete надо использовать там, где нужно освободить память. Где это в программе ты будешь делать - дело твое.
1
4 / 4 / 1
Регистрация: 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;
}
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
Я наверное не так объяснил...
вобщем это он удалит обин обьект а надо создать
C++
1
2
3
for(inr i=0;i<s.lingth;i++){
delete [i] s;
}
а пото вот тот код, это если под массивы а подж статически обьекты просто delete
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.10.2008, 13:50 11
Цитата Сообщение от dint Посмотреть сообщение
вобщем это он удалит обин обьект а надо создать
for(inr i=0;i<s.lingth;i++){
delete [i] s;
}
а пото вот тот код, это если под массивы а подж статически обьекты просто delete
Ты хоть думаешь, что пишешь? Бред просто наиполнейший. Самая первая строка даже как будто к объекту обращаешься...пипец... Откуда там какой lingth (length) возьмется. Кошмар.
Я не говорю, про то, что там не массив создается из указателей и твой код вообще работать не будет. Там и есть один "объект", а не то, что ты написал.
Если не уверен, не стоит писать такой мусор...
0
118 / 12 / 3
Регистрация: 21.08.2007
Сообщений: 222
28.10.2008, 14:58 12
Цитата Сообщение от dint Посмотреть сообщение
вобщем это он удалит обин обьект а надо создать
for(inr i=0;i<s.lingth;i++){
delete [i] s;
}
а пото вот тот код, это если под массивы а подж статически обьекты просто delete
Пробовал перечитать сам текст, не обращая внимания на код - ниасилил.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
28.10.2008, 15:00 13
я вообще забил на текст чисто интуитивно
Честно сказать, я даже не сразу сообразил, что это вообще С++
0
2 / 2 / 1
Регистрация: 23.10.2008
Сообщений: 27
28.10.2008, 22:46 14
Цитата Сообщение от Vourhey Посмотреть сообщение
Ты хоть думаешь, что пишешь? Бред просто наиполнейший. Самая первая строка даже как будто к объекту обращаешься...пипец... Откуда там какой lingth (length) возьмется. Кошмар.
Я не говорю, про то, что там не массив создается из указателей и твой код вообще работать не будет. Там и есть один "объект", а не то, что ты написал.
Если не уверен, не стоит писать такой мусор...
твои колменты справедливы по поводу что я обращяюсь не к обьекте но хотелось сделать более наглядней кто не первый раз открыл с++ поймет
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
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
17.05.2009, 17:25 18
Цитата Сообщение от leviaphan Посмотреть сообщение
Просто меня книга настращала (Джесс Либерти, Брэдли Джонс, "С++ за 21 день"). Там было написано, что если данные не удалены из динамической памяти с помощью delete, то до выключения компьютера они так и будут там храниться.
А книга в каком году была написана? Может быть в дремучие времена, когда были только однозадачные операционные ситемы? В этом случае такое ещё могло произойти.

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

Если много выделать памяти, но её не освобождать, то это доплнительная нагрузка на всю машину. ОС не знает, что ты эту память не используешь, а потому держит её, занимая при этом либо физическую память, либо дисковое пространство под swap
0
181 / 33 / 7
Регистрация: 29.10.2008
Сообщений: 283
17.05.2009, 18:19 19
CheshireCat, книга хорошая, просто он не так чтото понял.
0
17.05.2009, 18:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2009, 18:19
Помогаю со студенческими работами здесь

Удаление объекта, созданного в динамической памяти
Здравствуйте! Подскажите, пожалуйста, правильное решение такой проблемы (возможно, это и не...

Выделение и удаление памяти, выделенной для динамической строки
Данная функция производит ввод и собственно контроль ввода (размер массива от 1 до 20, иначе должна...

Не могу понять причину ошибки (связано с выделением динамической памяти под двумерный массив и ее удаление)
Я студент 1 курса , и выполняя задание столкнулся с проблемой. Вот само задание: Ввести оценки N...

Освобождение динамической памяти
После первого вызова функции(при повторном) пишет ошибку. В функции sort один из элементов массива...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru