Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 295
от 11.01.2006, 16:09

Администратор:Калашников О.А.
В рассылке:Подписчиков: 242, Экспертов: 42
В номере:Вопросов: 2, Ответов: 7


Вопрос № 32718: Здравствуйте! C наступающим! Когда динамически выделяешь память с помощью ключевого слова new то вроде как необходимо удалять то что создал с помощью delete. А если всё таки забыл удалить можно ли какой-нибудь программой удалить то ...
Вопрос № 32738: Здравствуйте! Скажите ,пожалуйста, как сделать генератор случайных чисел. Вариант MyValue=rand()%50; выдает одни и те же результаты при каждом новом запуске программы. ...

Вопрос № 32.718
Здравствуйте! C наступающим!
Когда динамически выделяешь память с помощью ключевого слова new
то вроде как необходимо удалять то что создал с помощью delete.
А если всё таки забыл удалить можно ли какой-нибудь программой
удалить то что насоздавал, тоесть очистить память или она со временем всё таки
удаляется автоматически(например с переустановкой ОС)?
И как можно проверить создался ли объект, который создаешь словом new??
Отправлен: 05.01.2006, 16:00
Вопрос задал: Rewer8 (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: BOIL
Здравствуйте, Rewer8!

Под управлением операционной системы, использующей т.наз. "защищенный" режим (Linux, Windows и т.п.) вся память, выделенная для приложения, полностью и незамедлительно возвращается в состояние свободных ресурсов сразу после завершения работы приложения.

Поэтому с точки зрения операционной системы, завершенное приложение утечку памяти вызвать не может.

Теперь по поводу использования new и delete.

Память, которую получает приложение, предоставляется операционной системой из области незанятой памяти. Конечно, общий размер памяти ограничен, поэтому долгая работа приложения, а может и операционной системы, при условии когда память выделяется но не освобождается, вообще говоря, невозможна.

В лучшем случае "заврвавшееся" приложение будет снято, а в худшем случае операционная система и сама "слетит" :)
Уж конечно, перезапуск операционной системы делает трудности с памятью не большим, чем страшый сон :-D

Поэтому рекомендуется после того, как память выделена new, осовобождать ее соответствующим вызовом delete

Удачи!...
Ответ отправил: BOIL (статус: 6-ой класс)
Отправлен: 05.01.2006, 16:33
Оценка за ответ: 5

Отвечает: Zitz
Здравствуйте, Rewer8!

Проверить создался ли объект по new очень просто: хендл не будет равен NULL
т.е.
int *i;
i = new (int);
if (i==NULL) ФАТАЛ_ЕГОГ
Для того чтобы очистилась память не нужно переустанавливать ось, достаточно перегрузиться, т.к. как только на модуле памяти пропадает питание там все стирается...
Лучше ВСЕГДА удалять все что насоздавал самому, хотя сейчас и занимаются этим "сборщики мусора", все зависит от винды, выбранной среды программирования... Ну Вы же сами понимаете, что 100% эффективности они не дают...
Ну а также есть куча всяких прог которые просматривают содержимое памяти, занимаются его редактированием и т.д., но все это только лишние мучения, намного проще написать строчку delete(i);, т.к. в памяти МНОГО всего лежит и поиск Вашей инфы будет занимать драгоченное время.
---------
Успех неизбежен
Ответ отправил: Zitz (статус: 4-ый класс)
Отправлен: 05.01.2006, 16:45
Оценка за ответ: 5

Отвечает: PROD
Здравствуйте, Rewer8!
на сколько я понимаю все эти процессы - то все динамически выделенные объекты на жесткий диск не записываются, и изначальный файл не изменяют. так что все что вы насоздавали очистится при закрытии вашей программы, если она завершилась благополучно, если она "рухнула" то память полюбому очистится при перезагрузке.
удалять созданные вами объекты нужно всегда, особенно когда их создается много (например в цикле или рекурсивно), иначе ваша (вашего компьютера :) память будет полностью занята и прога благополучно повиснет
Ответ отправил: PROD (статус: 2-ой класс)
Отправлен: 05.01.2006, 17:48
Оценка за ответ: 5

Отвечает: Jadd
Здравствуйте, Rewer8!
Если память не освободил, то ОСь освобождает ее по завершению процесса. Другое плохо, представь, что ты не собираешься прямо сейчас заканчивать работу программы и циклически, раз за разом, выделяешь память и не освобождаешь ее. В конечном итоге это будет отдирать память у оси. НЕКАРАШО!!!

Проверить создался объект или нет можно сравнив указатель на объект с NULL таким образом:
if (pMyObj == NULL)
//память не выделена, иначе память выделена

Удачи.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 05.01.2006, 20:18
Оценка за ответ: 5


Вопрос № 32.738
Здравствуйте!
Скажите ,пожалуйста, как сделать генератор случайных чисел.
Вариант MyValue=rand()%50; выдает одни и те же результаты при каждом новом запуске программы.
Отправлен: 05.01.2006, 23:02
Вопрос задал: Robson (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Татьяна
Здравствуйте, Robson!
если я вас правильно поняла, просто пропишите функцию
randomize();
в коде
---------
Нет ничего невозможного!!!
Ответ отправила: Татьяна (статус: Студент)
Отправлен: 05.01.2006, 23:11

Отвечает: estiGi
Здравствуйте, Robson!
Нужно один раз в программе, в самом начале, "проинициализировать" генератор:
srand (time (NULL));
Ответ отправил: estiGi (статус: 10-ый класс)
Отправлен: 05.01.2006, 23:38
Оценка за ответ: 5

Отвечает: PROD
Здравствуйте, Robson!
самый обычный генератор случайных чисел делается так:
randomize();
i=random(x);
где x диапозон в котором будут выбиратся числа
Ответ отправил: PROD (статус: 2-ой класс)
Отправлен: 06.01.2006, 10:53
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное