Инфо

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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