2013-04-17 1 views
0

От первого поиска об этом я нашел несколько источников, говорящих, что у меня, вероятно, есть утечка памяти. Но когда я искал подробные сведения о том, что происходит с утечкой памяти, он сказал, что я это делаю, когда я использую «новый» и не использую «delete». Но я не использовал новый даже один раз в своей программе, поэтому я предполагаю, что это означает, что проблема - это что-то другое , У меня нет растущих массивов или чего-то еще, о чем я могу думать, что это вызовет это. После инициализации программы я бы предположил, что после этого она не изменится, но я вырасту, и довольно быстро могу добавить.Почему память, которую использует моя программа, продолжает расти по мере ее запуска?

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

просто чтобы дать представление о том, приложение является 2d скроллер стороны, как супер Марио мире

+3

Даже вы, _you_, не используете 'new' напрямую, не означает, что какой-либо другой код вы используете. Если вы используете, например, 'std :: vector' будет увеличивать (и выделять память) по мере добавления к нему. –

+0

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

+1

И, наконец, если вы работаете в Linux или Mac OSX, вы можете использовать инструмент, называемый [Valgrind] (http://valgrind.org/), чтобы помочь найти утечки памяти. Visual Studio имеет нечто подобное встроенное в CRT, если вы отлаживаете свое приложение. –

ответ

1

Поскольку вы используете SDL, я подозреваю, что ассигнования исчисляются с SDL в звонках, таких как IMG_Load или SDL_LoadWave. Как правило, когда API дает вам указатель, это означает, что вы должны попросить API также освободить его.

Например, при вызове SDL_Surface вызов IMG_Load (или любые другие функции API для выделения изображения) выделяет память. Вам нужно будет вручную позвонить SDL_FreeSurface по каждому из ваших SDL_Surface, чтобы освободить память, когда вы закончите с ними.

Это то же самое с любым другим ресурсом в SDL.

+0

Хмм, Да, но я уверен, что я использую Free_Surface и другие функции очистки для каждого ресурса, когда им сделали с ними. после инициализации программы количество ресурсов, которые я объявляю или использую, остается неизменным. Тем не менее, использование памяти в программах увеличивается примерно на 300 кбит/с. Главное, что происходит, это программа «apply_surface» («перед каждым обновлением экрана?» Я должен освободить старую поверхность сначала, прежде чем применить обновленную, возможно,? – user1397417

+0

Я предполагаю, что вы последовали за учебником по Lazy Foo? вызывает 'SDL_BlitSurface', если ваш источник и адресат все еще действительны, вы не должны их освобождать. Вы уверены, что не создаете новые объекты и, например, нажимаете их в массиве? – emartel

+0

Я нашел его, я создавал новый "message = TTF_RenderText_Solid (font, msg.c_str(), textColor);" снова и снова в моем основном игровом цикле вместо обновления старого сообщения. Теперь использование памяти остается стабильным. спасибо, что показал мне, где искать. – user1397417

0

Я вижу, что у вас есть SDL как один из тегов, так что я предполагаю, что это 2D игра с помощью этой библиотеки ,

Если это так, то очень возможно, что использование одной из функций библиотеки может динамически выделять память.

Если вы разрабатываете Mac OS X, вы можете использовать бесплатный инструмент в комплекте с Xcode под названием «Инструменты»; у этого есть Шаблон для идентификации утечек памяти.

Если вы разрабатываете Windows, есть множество инструментов, которые вы можете использовать, один из которых является Parallel Studio от Intel, в который встроен инструмент анализа памяти, хотя он не является бесплатным.

Другой способ наблюдения за использованием памяти может заключаться в использовании платформы кросс-платформенной платформы тестирования Google C++. Эта структура позволит вам тестировать части вашего кода, чтобы вы могли видеть, какие вызовы SDL заставляют вашу память быстро расти.