[HELP] Вопрос по C++: Как принудительно освобождать память?
Пусть речь идет о массиве целых чисел например размера 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;
}
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мб памяти.
и выделить зашаренную память.
ps
на таких кол-вах 16мб памяти - выигрыш будет не больше стат. погрешности, т.к. запуск процесса намного более тормозное действие, чем выделение 16мб памяти.
Ладно, мне всё ясно. Спасибо за разъяснения.
Про утечки памяти слышал?
Про утечки памяти слышал?Не слышал. Рассказать можешь?

Нет. Что это?
Ты пользуешься ОС, в которой есть утечки памяти?
Ты пользуешься ОС, в которой есть утечки памяти?
Мне почему-то кажется, что уж в MustDie(Windows) то уж они наверняка есть.
Кстати, почему если плюсы, то лучше пользоваться словами new и delete?
Что-нибудь кроме эстетики?
Кстати, почему если плюсы, то лучше пользоваться словами new и delete?
Что-нибудь кроме эстетики?
> Мне почему-то кажется, что уж в MustDie(Windows) то уж они наверняка есть.
многолетний личный опыт программирования показывает, что большинство ошибок - это свои личные.
В чужом коде, особенно в библиотечном (общеиспользуемом) - ошибок достаточно мало.
поэтому если тебе кажется, что ошибка в windows-е - 3 раза тщательно проверь сначала свой код.
многолетний личный опыт программирования показывает, что большинство ошибок - это свои личные.
В чужом коде, особенно в библиотечном (общеиспользуемом) - ошибок достаточно мало.
поэтому если тебе кажется, что ошибка в windows-е - 3 раза тщательно проверь сначала свой код.
> Кстати, почему если плюсы, то лучше пользоваться словами new и delete?
> Что-нибудь кроме эстетики?
new может кидать exception-ы
> Что-нибудь кроме эстетики?
new может кидать exception-ы
Мне почему-то кажется, что уж в MustDie(Windows) то уж они наверняка есть.Твое право.
Надеюсь, что ты сможешь найти этому доказательства и предоставить на всеобщее обозрение.
Насчет new и delete - ничего, кроме эстетики и обратной несовместимости

Ну разве что ты можешь забыть умножить на sizeof(int) или умножить на sizeof(float) вместо этого (хотя на 32-битной платформе они и совпадают - идею ты понял, я думаю).
Причём тут ОС?
Или ты считаешь, что в супер-мега-линуксе нельзя написать неправильную программу?
Или ты считаешь, что в супер-мега-линуксе нельзя написать неправильную программу?
если работаешь с объектами, то new не только выделяет память, но и вызывает конструктор, т.о. использование new является обязательным.
2пенартур - не смеши людей. Утечка памяти - это явление в рамках одного сеанса работы процесса(по крайней мере обычно об этом речь после завершения процесса вся память возвращается ОС. Может если работать неаккуртано с разделяемой памятью - тут я хз.
2пенартур - не смеши людей. Утечка памяти - это явление в рамках одного сеанса работы процесса(по крайней мере обычно об этом речь после завершения процесса вся память возвращается ОС. Может если работать неаккуртано с разделяемой памятью - тут я хз.
2пенартур - не смеши людей. Утечка памяти - это явление в рамках одного сеанса работы процесса(по крайней мере обычно об этом речь после завершения процесса вся память возвращается ОС. Может если работать неаккуртано с разделяемой памятью - тут я хз.Физик-практик говорит "вот в таком случае происходит то-то". Физик-теоретик отвечает "как это, такого произойти никак не может, я знаю про такие, такие и такие случаи - и оно не должно происходить!"
Какая разница, должна память возвращаться или нет?
Важны факты, что она не возвращается, или возвращается как-то криво; и что после завершения работы процесса памяти выделено больше, чем до его запуска.
Можешь хоть сто раз сказать "такого быть не может" - от этого оно происходить не перестанет.
> В итоге память заканчивается.
Уверен, что ты след. экземпляр не запускаешь до того, как предыдущие полностью завершатся?
Уверен, что ты след. экземпляр не запускаешь до того, как предыдущие полностью завершатся?
Примеры встудию. И чем мерял. Такого я не видел
Важны факты, что она не возвращается, или возвращается как-то криво; и что после завершения работы процесса памяти выделено больше, чем до его запуска.
Мерял Task Manager'ом.
Через несоклько дней после загрузки винды, если закрыть _все_ запущенные приложения (таким образом, не останется ни одного лишнего процесса общее выделение памяти - на 100-400 метров выше, чем сразу после загрузку.
Через несоклько дней после загрузки винды, если закрыть _все_ запущенные приложения (таким образом, не останется ни одного лишнего процесса общее выделение памяти - на 100-400 метров выше, чем сразу после загрузку.
ЛОЛ чувак я с тя х№ею без баяна.
svchost ты тоже закрываешь? А он один, между прочим, метров пятьдесят влёгкую сожрать может - там и кэш сетки, и инет, и ещё фиг знает что.
Прикинь, в таск менеджере кроме закладки Applications есть ещё закладка Processes, и если выставить в Options->Columns показывать и физическую, и виртуальную занятую память, то можно узнать много интересного.
П№сдец, память у него утекает куда-то.
svchost ты тоже закрываешь? А он один, между прочим, метров пятьдесят влёгкую сожрать может - там и кэш сетки, и инет, и ещё фиг знает что.
Прикинь, в таск менеджере кроме закладки Applications есть ещё закладка Processes, и если выставить в Options->Columns показывать и физическую, и виртуальную занятую память, то можно узнать много интересного.
П№сдец, память у него утекает куда-то.
Прикинь, ты не один такой умный.
И все эти svchost'ы съедают памяти ровно столько же, сколько и сразу после загрузки - может, отличия и есть, но они укладываются в считанные метры. И ни о каких лишних _сотнях_ метров от этого не может быть и речи.
И все эти svchost'ы съедают памяти ровно столько же, сколько и сразу после загрузки - может, отличия и есть, но они укладываются в считанные метры. И ни о каких лишних _сотнях_ метров от этого не может быть и речи.
Я чуть со стула не упал
Без шуток.
Без шуток.
Еще его можно перегрузить.
Просуммируй, пожалуйста, цифры в последних двух колонках.

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

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

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

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

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

И освободит её при необходимости.Это само собой.
Я вот столкнулся с проблемой, что утекать запросто могут ресурсы. А т.к. ресурсы занимают некоторую память, то фактически утекает и память.
И почему всем от этого смешно мне, глупому, непонятно.
И почему всем от этого смешно мне, глупому, непонятно.
Не, ну ты просто ЖГУН. ПешЫ ышо. Валяюсь пацтулом.
Если уж хочешь разобраться, то ботай, ключевые слова:
физическая память, виртуальная память, файл подкачки.
Потом рюхай что и где показывает таскманагер.
И еще один хинт: не пользуйся таскманагером для определения занятой памяти, есть более точные средства.
Если уж хочешь разобраться, то ботай, ключевые слова:
физическая память, виртуальная память, файл подкачки.
Потом рюхай что и где показывает таскманагер.
И еще один хинт: не пользуйся таскманагером для определения занятой памяти, есть более точные средства.
Я вот тут столкнулся с проблемой, что утекать запросто могут ресурсы.Все ресурсы, битмапы, сокеты, файлы, семафоры, и пр. и пр. освобождаются после смерти процесса/процессов, обладающих этими ресурсами.
Ннну да, проверил, правда.
Ббберу свои слова обратно.
Ббберу свои слова обратно.
> И все эти svchost'ы съедают памяти ровно столько же, сколько и сразу после загрузки
как минимум еще есть System Cache и kernel
как минимум еще есть System Cache и kernel
new может кидать exception-ыdelete тоже, полезная штука
Блин действительно ошибаюсь, не кидает ...
> delete тоже, полезная штука
delete не должен кидать исключения. Если будет - это будет кошмар.
delete не должен кидать исключения. Если будет - это будет кошмар.
У меня - не освобождает.
Более того, эта занятая память - её иногда даже больше физической становится. Довольно странно хранить дисковый кэш в свопе, тебе не кажется?
Более того, эта занятая память - её иногда даже больше физической становится. Довольно странно хранить дисковый кэш в свопе, тебе не кажется?
физическая память, виртуальная память, файл подкачки.Уже.
Потом рюхай что и где показывает таскманагер.
И еще один хинт: не пользуйся таскманагером для определения занятой памятиПочему-то таскманагер показывает то же самое, что и, к примеру, ФАР.
2 - прикинь, а на мехмате ещё и складывать умеют... не ожидал?
>> 2 - прикинь, а на мехмате ещё и складывать умеют... не ожидал?
Ну и где результаты? Результаты-то покажи, ага!
Ну и где результаты? Результаты-то покажи, ага!
Оставить комментарий
Yulka-MOl
Доброе время суток.Вопрос по C++ (Visual C++ под Windows).
Суть вопроса: Есть консольная программа, которая при запуске выделяет довольно большой кусок памяти для своей работы (с графикой например). Эту программу необходимо (по условию задачи) многократно запускать (многократно - это около 1000 раз как минимум).
Если я пользуюсь командами malloc и free, то Windows по ходу не всегда освобождает память по окончании работы программы. В итоге память заканчивается.
Посоветуйте [дайте ссылку на статьи] как этого можно избежать.
Заранее спасибо.