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

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

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

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

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

В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи запущенной много раз, она так и не зависла. Для большей уверенности я поставил галочку release и запускал её не через F5, а через exe-файл. Получается, что в C++ есть сборщик мусора?
P.S. Пользуюсь Visual Studio 2008.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2008, 08:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление динамической памяти (C++):

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

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

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

Удаление вектора из области динамической памяти. - C++
Всем привет! Прошу разъяснить. Как правильно удалить содержимое вектора? class Coordinate { public: Coordinate() {} int...

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

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

18
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++.
1
leviaphan
4 / 4 / 0
Регистрация: 18.08.2008
Сообщений: 73
28.10.2008, 10:03  [ТС] #3
Цитата Сообщение от igor_nf Посмотреть сообщение
А почему вы решили, что программа должна зависать? ОС сама подчистит память по завершении работы программы. А сборщика в С++ нет никакого, если имеется ввиду unmanaged C++.
Просто меня книга настращала (Джесс Либерти, Брэдли Джонс, "С++ за 21 день"). Там было написано, что если данные не удалены из динамической памяти с помощью delete, то до выключения компьютера они так и будут там храниться.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
28.10.2008, 10:36 #4
Читай меньше всяких глупостей "за 21 день".
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 12:20 #5
CheshireCat, +1

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

leviaphan, хранится могут. Только на них что угодно можно записать. Это место не будет занято, так как, процесс умер. А что там он в памяти оставил всем остальным уже пофигу.
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 12:31 #7
Цитата Сообщение от leviaphan Посмотреть сообщение
Т. е. delete нужно использовать только если надо освободить участок памяти до завершения программы? И в конце функции main() удалять динамические объекты уже бессмысленно?
delete надо использовать там, где нужно освободить память. Где это в программе ты будешь делать - дело твое.
1
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;
}
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 13:06 #9
Нет, не все равно.
Во-первых, есть гарантия, что память нормально освободится. Не будет сюрпризов.
Во-вторых, если будут сюрпризы (например, ты выйдешь за область памяти), то по завершении программа может вывалить ошибку запросто. Как ты этот случай собираешься обрабатывать без явного удаления?
В-третьих, как насчет нормального вызова деструктора(ов)?
В-четвертых, как насчет не полагаться на то, что система все сделает гут? Если ты можешь сам все сделать, то зачем на авось полагаться? Не сваливай на систему, что лучше делать самой программе.
1
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
1
Vourhey
Почетный модератор
6485 / 2259 / 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) возьмется. Кошмар.
Я не говорю, про то, что там не массив создается из указателей и твой код вообще работать не будет. Там и есть один "объект", а не то, что ты написал.
Если не уверен, не стоит писать такой мусор...
0
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
Пробовал перечитать сам текст, не обращая внимания на код - ниасилил.
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.10.2008, 15:00 #13
я вообще забил на текст чисто интуитивно
Честно сказать, я даже не сразу сообразил, что это вообще С++
0
dint
2 / 2 / 0
Регистрация: 23.10.2008
Сообщений: 27
28.10.2008, 22:46 #14
Цитата Сообщение от Vourhey Посмотреть сообщение
Ты хоть думаешь, что пишешь? Бред просто наиполнейший. Самая первая строка даже как будто к объекту обращаешься...пипец... Откуда там какой lingth (length) возьмется. Кошмар.
Я не говорю, про то, что там не массив создается из указателей и твой код вообще работать не будет. Там и есть один "объект", а не то, что ты написал.
Если не уверен, не стоит писать такой мусор...
твои колменты справедливы по поводу что я обращяюсь не к обьекте но хотелось сделать более наглядней кто не первый раз открыл с++ поймет
0
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
28.10.2008, 23:50 #15
Мля, опять же, прочитал его высказывание, с ходу не прорубился... По моему, у кого то по русскому отметко было ниже плинтуса.
0
28.10.2008, 23:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2008, 23:50
Привет! Вот еще темы с ответами:

Вопрос по динамической памяти - C++
мне надо создать масив содержащий структуры. У меня вот код какой: vec *fild;//vec это название структуры конструктор ...

Освобождение динамической памяти в vs - C++
Вообщем попался я тут, и так, код: //#define _CRT_SECURE_NO_WARNINGS добавить в vs #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...

Выделение динамической памяти - C++
Доброго времени суток! я начинающий программист, столкнулась с такой проблемой: выделяю память под динамический массив, например ...

Выделение динамической памяти C++ - C++
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод,...


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

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

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