[HELP] Вопрос по C++: Как принудительно освобождать память?
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;
}
Операционная система после завершения процесса освобождает всю память, которую он брал. Так что _последовательный_ тысячекратный запуск твоей проги не должен быть проблемой.
хорошо если так.
Раз у тебя плюсы, лучше пользуйся словами new и delete.
А если я знаю, что мою прогу будут _последовательно_ запускать 1000 раз, то я могу как-нибудь избежать процесса выделения памяти?
и выделить зашаренную память.
ps
на таких кол-вах 16мб памяти - выигрыш будет не больше стат. погрешности, т.к. запуск процесса намного более тормозное действие, чем выделение 16мб памяти.
Ладно, мне всё ясно. Спасибо за разъяснения.
Про утечки памяти слышал?
Про утечки памяти слышал?Не слышал. Рассказать можешь?
Ты пользуешься ОС, в которой есть утечки памяти?
Кстати, почему если плюсы, то лучше пользоваться словами new и delete?
Что-нибудь кроме эстетики?
многолетний личный опыт программирования показывает, что большинство ошибок - это свои личные.
В чужом коде, особенно в библиотечном (общеиспользуемом) - ошибок достаточно мало.
поэтому если тебе кажется, что ошибка в windows-е - 3 раза тщательно проверь сначала свой код.
> Что-нибудь кроме эстетики?
new может кидать exception-ы
Мне почему-то кажется, что уж в MustDie(Windows) то уж они наверняка есть.Твое право.
Надеюсь, что ты сможешь найти этому доказательства и предоставить на всеобщее обозрение.
Насчет new и delete - ничего, кроме эстетики и обратной несовместимости
Ну разве что ты можешь забыть умножить на sizeof(int) или умножить на sizeof(float) вместо этого (хотя на 32-битной платформе они и совпадают - идею ты понял, я думаю).
Или ты считаешь, что в супер-мега-линуксе нельзя написать неправильную программу?
2пенартур - не смеши людей. Утечка памяти - это явление в рамках одного сеанса работы процесса(по крайней мере обычно об этом речь после завершения процесса вся память возвращается ОС. Может если работать неаккуртано с разделяемой памятью - тут я хз.
2пенартур - не смеши людей. Утечка памяти - это явление в рамках одного сеанса работы процесса(по крайней мере обычно об этом речь после завершения процесса вся память возвращается ОС. Может если работать неаккуртано с разделяемой памятью - тут я хз.Физик-практик говорит "вот в таком случае происходит то-то". Физик-теоретик отвечает "как это, такого произойти никак не может, я знаю про такие, такие и такие случаи - и оно не должно происходить!"
Какая разница, должна память возвращаться или нет?
Важны факты, что она не возвращается, или возвращается как-то криво; и что после завершения работы процесса памяти выделено больше, чем до его запуска.
Можешь хоть сто раз сказать "такого быть не может" - от этого оно происходить не перестанет.
Уверен, что ты след. экземпляр не запускаешь до того, как предыдущие полностью завершатся?
Примеры встудию. И чем мерял. Такого я не видел
Важны факты, что она не возвращается, или возвращается как-то криво; и что после завершения работы процесса памяти выделено больше, чем до его запуска.
Через несоклько дней после загрузки винды, если закрыть _все_ запущенные приложения (таким образом, не останется ни одного лишнего процесса общее выделение памяти - на 100-400 метров выше, чем сразу после загрузку.
svchost ты тоже закрываешь? А он один, между прочим, метров пятьдесят влёгкую сожрать может - там и кэш сетки, и инет, и ещё фиг знает что.
Прикинь, в таск менеджере кроме закладки Applications есть ещё закладка Processes, и если выставить в Options->Columns показывать и физическую, и виртуальную занятую память, то можно узнать много интересного.
П№сдец, память у него утекает куда-то.
И все эти svchost'ы съедают памяти ровно столько же, сколько и сразу после загрузки - может, отличия и есть, но они укладываются в считанные метры. И ни о каких лишних _сотнях_ метров от этого не может быть и речи.
Без шуток.
Еще его можно перегрузить.
Дальше сравни полученные две цифры с разными цифрами в низу этой картинки.
Найдёшь разницу - расскажи.
Жжешь.
Через несоклько дней после загрузки винды, если закрыть _все_ запущенные приложения (таким образом, не останется ни одного лишнего процесса общее выделение памяти - на 100-400 метров выше, чем сразу после загрузку.Хватит тупить. Любая нормальная ОС сожрет постепенно всю доступную память под кеши.
Хватит тупить. Любая нормальная ОС сожрет постепенно всю доступную память под кеши.И освободит её при необходимости.
И освободит её при необходимости.Это само собой.
И почему всем от этого смешно мне, глупому, непонятно.
Если уж хочешь разобраться, то ботай, ключевые слова:
физическая память, виртуальная память, файл подкачки.
Потом рюхай что и где показывает таскманагер.
И еще один хинт: не пользуйся таскманагером для определения занятой памяти, есть более точные средства.
Я вот тут столкнулся с проблемой, что утекать запросто могут ресурсы.Все ресурсы, битмапы, сокеты, файлы, семафоры, и пр. и пр. освобождаются после смерти процесса/процессов, обладающих этими ресурсами.
Ббберу свои слова обратно.
как минимум еще есть System Cache и kernel
new может кидать exception-ыdelete тоже, полезная штука
Блин действительно ошибаюсь, не кидает ...
delete не должен кидать исключения. Если будет - это будет кошмар.
Более того, эта занятая память - её иногда даже больше физической становится. Довольно странно хранить дисковый кэш в свопе, тебе не кажется?
физическая память, виртуальная память, файл подкачки.Уже.
Потом рюхай что и где показывает таскманагер.
И еще один хинт: не пользуйся таскманагером для определения занятой памятиПочему-то таскманагер показывает то же самое, что и, к примеру, ФАР.
2 - прикинь, а на мехмате ещё и складывать умеют... не ожидал?
Ну и где результаты? Результаты-то покажи, ага!
Оставить комментарий
Yulka-MOl
Доброе время суток.Вопрос по C++ (Visual C++ под Windows).
Суть вопроса: Есть консольная программа, которая при запуске выделяет довольно большой кусок памяти для своей работы (с графикой например). Эту программу необходимо (по условию задачи) многократно запускать (многократно - это около 1000 раз как минимум).
Если я пользуюсь командами malloc и free, то Windows по ходу не всегда освобождает память по окончании работы программы. В итоге память заканчивается.
Посоветуйте [дайте ссылку на статьи] как этого можно избежать.
Заранее спасибо.