[HELP] Вопрос по C++: Как принудительно освобождать память?

Yulka-MOl

Доброе время суток.
Вопрос по C++ (Visual C++ под Windows).
Суть вопроса: Есть консольная программа, которая при запуске выделяет довольно большой кусок памяти для своей работы (с графикой например). Эту программу необходимо (по условию задачи) многократно запускать (многократно - это около 1000 раз как минимум).
Если я пользуюсь командами malloc и free, то Windows по ходу не всегда освобождает память по окончании работы программы. В итоге память заканчивается.
Посоветуйте [дайте ссылку на статьи] как этого можно избежать.
Заранее спасибо.

Yulka-MOl

Пусть речь идет о массиве целых чисел например размера 2000 x 2000.
int** b;
b = (int**) malloc (2000 * sizeof(int*;
for(i = 0; i < 2000; i++)
{
b[i] = (int*) malloc (2000 * sizeof(int;
}
// текст проги
// текст проги
if(b)
{
for(i = 0; i < 2000; i++)
{
if(b[i])
{
free(b[i]);
b[i] = NULL;
}
}
free(b);
b = NULL;
}

aleks058

Операционная система после завершения процесса освобождает всю память, которую он брал. Так что _последовательный_ тысячекратный запуск твоей проги не должен быть проблемой.

Yulka-MOl

хорошо если так.

aleks058

Раз у тебя плюсы, лучше пользуйся словами new и delete.

Yulka-MOl

А если я знаю, что мою прогу будут _последовательно_ запускать 1000 раз, то я могу как-нибудь избежать процесса выделения памяти?

Dasar

запустить еще один процесс, которую будет висеть постоянно.
и выделить зашаренную память.
ps
на таких кол-вах 16мб памяти - выигрыш будет не больше стат. погрешности, т.к. запуск процесса намного более тормозное действие, чем выделение 16мб памяти.

Yulka-MOl

Ладно, мне всё ясно. Спасибо за разъяснения.

kruzer25

Про утечки памяти слышал?

Yulka-MOl

Про утечки памяти слышал?
Не слышал. Рассказать можешь?

aleks058

Нет. Что это?
Ты пользуешься ОС, в которой есть утечки памяти?

Yulka-MOl

Мне почему-то кажется, что уж в MustDie(Windows) то уж они наверняка есть.
Кстати, почему если плюсы, то лучше пользоваться словами new и delete?
Что-нибудь кроме эстетики?

Dasar

> Мне почему-то кажется, что уж в MustDie(Windows) то уж они наверняка есть.
многолетний личный опыт программирования показывает, что большинство ошибок - это свои личные.
В чужом коде, особенно в библиотечном (общеиспользуемом) - ошибок достаточно мало.
поэтому если тебе кажется, что ошибка в windows-е - 3 раза тщательно проверь сначала свой код.

Landstreicher

> Кстати, почему если плюсы, то лучше пользоваться словами new и delete?
> Что-нибудь кроме эстетики?
new может кидать exception-ы

aleks058

Мне почему-то кажется, что уж в MustDie(Windows) то уж они наверняка есть.
Твое право.
Надеюсь, что ты сможешь найти этому доказательства и предоставить на всеобщее обозрение.
Насчет new и delete - ничего, кроме эстетики и обратной несовместимости
Ну разве что ты можешь забыть умножить на sizeof(int) или умножить на sizeof(float) вместо этого (хотя на 32-битной платформе они и совпадают - идею ты понял, я думаю).

kruzer25

Причём тут ОС?
Или ты считаешь, что в супер-мега-линуксе нельзя написать неправильную программу?

FRider

если работаешь с объектами, то new не только выделяет память, но и вызывает конструктор, т.о. использование new является обязательным.

2пенартур - не смеши людей. Утечка памяти - это явление в рамках одного сеанса работы процесса(по крайней мере обычно об этом речь после завершения процесса вся память возвращается ОС. Может если работать неаккуртано с разделяемой памятью - тут я хз.

kruzer25

2пенартур - не смеши людей. Утечка памяти - это явление в рамках одного сеанса работы процесса(по крайней мере обычно об этом речь после завершения процесса вся память возвращается ОС. Может если работать неаккуртано с разделяемой памятью - тут я хз.
Физик-практик говорит "вот в таком случае происходит то-то". Физик-теоретик отвечает "как это, такого произойти никак не может, я знаю про такие, такие и такие случаи - и оно не должно происходить!"
Какая разница, должна память возвращаться или нет?
Важны факты, что она не возвращается, или возвращается как-то криво; и что после завершения работы процесса памяти выделено больше, чем до его запуска.
Можешь хоть сто раз сказать "такого быть не может" - от этого оно происходить не перестанет.

Marinavo_0507

> В итоге память заканчивается.
Уверен, что ты след. экземпляр не запускаешь до того, как предыдущие полностью завершатся?

FRider



Важны факты, что она не возвращается, или возвращается как-то криво; и что после завершения работы процесса памяти выделено больше, чем до его запуска.
Примеры встудию. И чем мерял. Такого я не видел

kruzer25

Мерял Task Manager'ом.
Через несоклько дней после загрузки винды, если закрыть _все_ запущенные приложения (таким образом, не останется ни одного лишнего процесса общее выделение памяти - на 100-400 метров выше, чем сразу после загрузку.

bleyman

ЛОЛ чувак я с тя х№ею без баяна.
svchost ты тоже закрываешь? А он один, между прочим, метров пятьдесят влёгкую сожрать может - там и кэш сетки, и инет, и ещё фиг знает что.
Прикинь, в таск менеджере кроме закладки Applications есть ещё закладка Processes, и если выставить в Options->Columns показывать и физическую, и виртуальную занятую память, то можно узнать много интересного.
П№сдец, память у него утекает куда-то.

kruzer25

Прикинь, ты не один такой умный.
И все эти svchost'ы съедают памяти ровно столько же, сколько и сразу после загрузки - может, отличия и есть, но они укладываются в считанные метры. И ни о каких лишних _сотнях_ метров от этого не может быть и речи.

ppplva

Я чуть со стула не упал
Без шуток.

ppplva

Еще его можно перегрузить.

bleyman

Просуммируй, пожалуйста, цифры в последних двух колонках.

Дальше сравни полученные две цифры с разными цифрами в низу этой картинки.

Найдёшь разницу - расскажи.

Sharp

Жжешь.

Papazyan

Через несоклько дней после загрузки винды, если закрыть _все_ запущенные приложения (таким образом, не останется ни одного лишнего процесса общее выделение памяти - на 100-400 метров выше, чем сразу после загрузку.
Хватит тупить. Любая нормальная ОС сожрет постепенно всю доступную память под кеши.

kokoc88

Хватит тупить. Любая нормальная ОС сожрет постепенно всю доступную память под кеши.
И освободит её при необходимости.

Papazyan

И освободит её при необходимости.
Это само собой.

erotic

Я вот столкнулся с проблемой, что утекать запросто могут ресурсы. А т.к. ресурсы занимают некоторую память, то фактически утекает и память.
И почему всем от этого смешно мне, глупому, непонятно.

FRider

Не, ну ты просто ЖГУН. ПешЫ ышо. Валяюсь пацтулом.

Если уж хочешь разобраться, то ботай, ключевые слова:
физическая память, виртуальная память, файл подкачки.
Потом рюхай что и где показывает таскманагер.

И еще один хинт: не пользуйся таскманагером для определения занятой памяти, есть более точные средства.

kokoc88

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

erotic

Ннну да, проверил, правда.
Ббберу свои слова обратно.

Dasar

> И все эти svchost'ы съедают памяти ровно столько же, сколько и сразу после загрузки
как минимум еще есть System Cache и kernel

vertyal17

new может кидать exception-ы
delete тоже, полезная штука
Блин действительно ошибаюсь, не кидает ...

Landstreicher

> delete тоже, полезная штука
delete не должен кидать исключения. Если будет - это будет кошмар.

kruzer25

У меня - не освобождает.
Более того, эта занятая память - её иногда даже больше физической становится. Довольно странно хранить дисковый кэш в свопе, тебе не кажется?

kruzer25

физическая память, виртуальная память, файл подкачки.
Потом рюхай что и где показывает таскманагер.
Уже.
И еще один хинт: не пользуйся таскманагером для определения занятой памяти
Почему-то таскманагер показывает то же самое, что и, к примеру, ФАР.
2 - прикинь, а на мехмате ещё и складывать умеют... не ожидал?

bleyman

>> 2 - прикинь, а на мехмате ещё и складывать умеют... не ожидал?
Ну и где результаты? Результаты-то покажи, ага!
Оставить комментарий
Имя или ник:
Комментарий: