Разумевање и спречавање цурења меморије у Делфима

click fraud protection

Делпхиподршка за објектно оријентисано програмирање је богата и моћна. Класе и објекти омогућавају модуларно програмирање кода. Заједно са модуларнијим и сложенијим компонентама стижу и софистициранији и сложенији грешке.

Док се развија апликације у Делпхију је (скоро) увек забавно, постоје ситуације када се осећате као да је цео свет против вас.

Кад год требате да користите (креирате) објект у Делфи, морате да ослободите меморију коју је потрошио (једном више није потребна). Свакако, блокови за заштиту од покушаја / коначно меморије могу вам помоћи да спречите цурење меморије; Још увек је на вама да заштитите свој код.

Пропуштање меморије (или ресурса) догађа се када програм изгуби могућност да ослободи меморију коју троши. Понављано цурење меморије узрокује да се меморија процеса повећава без икаквих граница. Пропуштање меморије је озбиљан проблем - ако имате код који узрокује цурење меморије, у покренутој апликацији 24/7, апликација ће појести сву доступну меморију и коначно учинити да машина престане да реагује.

instagram viewer

Пропуштање меморије у Делфима

Први корак за избегавање цурења меморије је разумевање како се оне јављају. Следи дискусија о неким уобичајеним замкама и најбољим праксама за писање непропусног Делпхи кода.

У већини (једноставних) Делпхи апликација, где користите компоненте (Буттонс, Мемос, Едитс, итд.) Које испаднете на образац (у време дизајнирања), не морате се превише бринути о управљању меморијом. Једном када се компонента постави на образац, облик постаје свој власник и ослободиће меморију коју компонента заузме након што се облик затвори (уништи). Форм, као власник, одговоран је за размјештање меморија компоненти које је домаћин. Укратко: компоненте на обрасцу се креирају и уништавају аутоматски

Примери пропуштања меморије

У било којој невијалној Делпхи апликацији то ћете и пожељети инстанцирати Делпхи компоненте у току рада. Такође ћете имати неке сопствене прилагођене часове. Рецимо да имате класу ТДевелопер која има методу ДоПрограм. Сада, када требате да користите класу ТДевелопер, креирате инстанцу класе позивањем Креирај метода (конструктор). Метода Цреате додељује меморију за нови објект и враћа референцу на објект.

вар
зарко: ТДевелопер
започети
зарко: = ТМиОбјецт. Креирај;
зарко. ДоПрограм;
крај;

И ево једноставног цурења меморије!

Кад год креирате објект, морате одложити меморију коју је заузимао. Да бисте ослободили меморију додељеном објекту, морате позвати бесплатно метод. Да бисте били потпуно сигурни, такође треба да употребите покушај / коначно блокирање:

вар
зарко: ТДевелопер
започети
зарко: = ТМиОбјецт. Креирај;
покушати
зарко. ДоПрограм;
напокон
зарко. Бесплатно;
крај;
крај;

Ово је пример сигурне расподјеле меморије и кода за размјештај.

Неке речи упозорења: Ако желите да динамички активирате Делпхи компоненту и изричито је ослободите нешто касније, увек унесите нулу као власника. Ако то не учините, можете увести непотребан ризик, као и проблеме са перформансама и одржавањем кода.

Поред стварања и уништавања објеката помоћу метода Цреате анд Фрее, морате бити веома опрезни и када користите „спољне“ (датотеке, базе података, итд.) Ресурсе.
Рецимо да морате радити на некој текстуалној датотеци. У веома једноставном сценарију, где се метода АссигнФиле користи за придруживање датотеке на диску датотеци променљиву када завршите са датотеком, морате позвати ЦлосеФиле да бисте покренули руковање датотекама користи. Овде немате експлицитни позив „Бесплатно“.

вар
Ф: ТектФиле;
С: стринг;
започети
АссигнФиле (Ф, 'ц: \ сомефиле.ткт');
покушати
Реадлн (Ф, С);
напокон
ЦлосеФиле (Ф);
крај;
крај;

Други пример укључује учитавање спољних ДЛЛ-ова из вашег кода. Кад год користите ЛоадЛибрари, морате назвати ФрееЛибрари:

вар
дллХандле: ТХандле;
започети
дллХандле: = Лоадлибрари ('МојаЛиблиотека. ДЛЛ ');
// урадите нешто с овом ДЛЛ-ом
ако је дллХандле <> 0, тада ФрееЛибрари (дллХандле);
крај;

Меморија цури у .НЕТ-у?

Иако са Делпхи за .НЕТ сакупљач смећа (ГЦ) управља већином меморијских задатака, могуће је пропуштање меморије у .НЕТ апликацијама. Ево расправе о чланку ГЦ у Делфима за .НЕТ.

Како се борити против цурења меморије

Поред писања модуларног кода који је безбедан у меморији, спречавање пропуштања меморије може се обавити и коришћењем неких доступних алата треће стране. Делпхи Алати за исправљање меморије помажу вам да ухвате апликацију Делпхи грешке попут оштећења меморије, цурења меморије, грешака у додељивању меморије, грешака иницијализације променљивих, конфликата променљиве дефиниције, грешке поинтера и још много тога.

instagram story viewer