purebasic.info

PureBasic forum
Текущее время: Пн дек 11, 2017 4:37 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 8:47 am 
Не в сети
доцент

Зарегистрирован: Ср апр 02, 2014 12:55 pm
Сообщений: 46
Благодарил (а): 5 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Есть какие нибудь правила, чтобы избегать утечки памяти ?
Я имею ввиду кто уже долго пишет на пурике, наверняка сформулировал такой набор правил для себя.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 9:38 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Главное правило - освобождать ресурсы, когда они не нужны.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 4:05 pm 
Не в сети
профессор

Зарегистрирован: Пт янв 25, 2008 5:13 pm
Сообщений: 362
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 5
Пётр писал(а):
Главное правило - освобождать ресурсы, когда они не нужны.

Особенно в циклах.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 4:13 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Я, например, делаю так:
Код:
1
2
3
4
5
*mem = AllocateMemory(1024)
If *mem
   ;Действия с памятью
   FreeMemory(*mem)
EndIf

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

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 5:52 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2232
Откуда: Russia — Belarus
Благодарил (а): 0 раз.
Поблагодарили: 66 раз.
Пункты репутации: 11
Еще после FreeMemory() не помешает *mem делать нулём (*mem = 0).

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 7:02 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 545
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
qpAHToMAS писал(а):
Еще после FreeMemory() не помешает *mem делать нулём (*mem = 0).

каким боком это должно работать?
*mem это всего ссылка(начальный адрес памяти)
Вот процедура ReAllocateMemory,реально поможет. :wink:
Или наверное при модульном программировании?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 8:34 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Никита Однороб писал(а):
Я, например, делаю так:
Код:
1
2
3
4
5
*mem = AllocateMemory(1024)
If *mem
   ;Действия с памятью
   FreeMemory(*mem)
EndIf

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


qpAHToMAS писал(а):
Еще после FreeMemory() не помешает *mem делать нулём (*mem = 0).


Вы сегодня вместе что то курили?
Один проверяет адрес, который даже после освобождения останется адресом. Другой адресу 0 присваивает, что бы уж точно не наткнуться на него, а если вдруг, то ошибка.

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

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 9:26 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Я адрес вроде нигде не проверяю :?

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 9:57 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Никита Однороб писал(а):
Я адрес вроде нигде не проверяю :?


Код:
1
2
3
4
5
*mem = AllocateMemory(1024)
If *mem
   ;Действия с памятью
   FreeMemory(*mem)
EndIf


Ой, извини, я не так твой код понял, мне почему то показалось, что ты освобождаеш память, а потом проверяеш чему она стала ровна. Ещё раз прошу прощения. 8)

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 10:42 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2232
Откуда: Russia — Belarus
Благодарил (а): 0 раз.
Поблагодарили: 66 раз.
Пункты репутации: 11
После FreeMemory() ничего не указывает на то, что память была очищена, сделать указатель нулём — один из способов.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 11:38 pm 
Не в сети
доцент

Зарегистрирован: Чт ноя 01, 2012 10:54 am
Сообщений: 58
Откуда: Стрый, Украина
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Извиняюсь за возможный оффтоп, но очень хочется спросить. Нужно ли освобождать дескриптор иконки, например, полученный такой функцией как SHGetFileInfo или ExtractAssociatedIcon (и им подобными). Если да, то как правильно это делать (DestroyIcon ???)?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пт окт 24, 2014 11:56 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
ldir писал(а):
Нужно ли освобождать дескриптор иконки, например, полученный такой функцией как SHGetFileInfo или ExtractAssociatedIcon
Нужно ввести название функции в поисковик и обычно первая же ссылка будет вести на сайт майкрософта.
Смотрим описание SHGetFileInfo
Цитата:
If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with DestroyIcon when you no longer need it.
И описание ExtractAssociatedIcon.
Цитата:
You must destroy the icon handle returned by ExtractAssociatedIcon by calling the DestroyIcon function.
Думаю понятно что необходимо использовать DestroyIcon.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Сб окт 25, 2014 12:06 am 
Не в сети
доцент

Зарегистрирован: Чт ноя 01, 2012 10:54 am
Сообщений: 58
Откуда: Стрый, Украина
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Пётр, спасибо. Собственная лень всегда мешает дочитывать до конца описания на вражеском языке.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Чт авг 03, 2017 7:58 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1561
Откуда: Алматы
Благодарил (а): 12 раз.
Поблагодарили: 37 раз.
Пункты репутации: 5
у меня вопрос по поводу копирования картинок. хотелось бы уточнить окончательно и бесповоротно один момент:
CreateImage(картинка1)
CreateImage(картинка2)
какой-то код где обе картинки применяются
нужно ли перед копированием FreeImage(картинка2)?
CopyImage(картинка1, картинка2)

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB