Разберете и предотвратете течовете на памет в Delphi

click fraud protection

DelphiПоддръжката за обектно-ориентирано програмиране е богата и мощна. Класовете и обектите позволяват модулно програмиране на кодове. Заедно с по-модулните и по-сложни компоненти идват и по-сложни и по-сложни буболечки.

Докато се развива приложения в Delphi е (почти) винаги забавно, има ситуации, когато чувстваш, че целият свят е срещу теб.

Всеки път, когато трябва да използвате (създадете) обект в Delphi, трябва да освободите паметта, която е консумирала (веднъж вече не е необходима). Със сигурност блоковете за защита на пробната / накрая памет могат да ви помогнат да предотвратите изтичане на памет; все още зависи от вас да защитите кода си.

Изтичане на памет (или ресурс) възниква, когато програмата загуби способността да освободи паметта, която консумира. Многократните течове на памет водят до използване на паметта на даден процес без ограничения. Изтичането на паметта е сериозен проблем - ако имате код, причиняващ изтичане на памет, в работещо приложение 24/7, приложението ще изяде цялата налична памет и накрая ще накара машината да спре да реагира.

instagram viewer

Изтичане на паметта в Delphi

Първата стъпка за избягване на течовете на паметта е да разберете как се появяват. Следва обсъждане на някои често срещани клопки и най-добри практики за писане на непропусклив код на Delphi.

В повечето (прости) приложения на Delphi, където използвате компонентите (бутони, бележки, редакции и т.н.), които падате върху формуляр (по време на проектиране), не е нужно да се интересувате прекалено много от управлението на паметта. След като компонентът е поставен върху форма, формата става негова собственик и ще освободи паметта, взета от компонента, след като формата е затворена (унищожена). Form, като собственик, е отговорен за разместването на паметта на компонентите, които е хоствал. Накратко: компоненти във формуляр се създават и унищожават автоматично

Примери за течове на памет

Във всяко нетривиално приложение Delphi ще искате създайте Delphi компоненти по време на изпълнение. Вие също ще имате някои от вашите собствени персонализирани класове. Да речем, че имате клас TDeveloper, който има метод DoProgram. Сега, когато трябва да използвате класа TDeveloper, създавате екземпляр от класа, като се обаждате на създавам метод (конструктор). Методът Create създава памет за нов обект и връща препратка към обекта.

Var
zarko: TDeveloper
започвам
zarko: = TMyObject. Създаване;
Зарко. DoProgram;
край;

И ето едно обикновено изтичане на памет!

Всеки път, когато създавате обект, трябва да изхвърлите паметта, която е заемал. За да освободите паметта на разпределен обект, трябва да се обадите на Безплатно метод. За да сте напълно сигурни, трябва да използвате и опитайте / най-накрая блокирайте:

Var
zarko: TDeveloper
започвам
zarko: = TMyObject. Създаване;
опитвам
Зарко. DoProgram;
накрая
Зарко. Безплатно;
край;
край;

Това е пример за безопасно разпределение на паметта и код за разместване.

Някои предупредителни думи: Ако искате динамично да създадете компонент на Delphi и изрично да го освободите някъде по-късно, винаги предавайте нула като собственик. Ако не го направите, това може да доведе до ненужен риск, както и проблеми с работата и поддръжката на кода.

Освен да създавате и унищожавате обекти, използвайки методите Create and Free, трябва да бъдете много внимателни и когато използвате "външни" (файлове, бази данни и т.н.) ресурси.
Да речем, че трябва да работите върху някакъв текстов файл. В много прост сценарий, при който методът AssignFile се използва за свързване на файл на диск с файл променлива, когато приключите с файла, трябва да се обадите на CloseFile, за да освободите дръжката на файла, за да започнете използва. Тук нямате изрично обаждане към „Безплатно“.

Var
F: TextFile;
S: низ;
започвам
AssignFile (F, 'c: \ somefile.txt');
опитвам
Readln (F, S);
накрая
CloseFile (F);
край;
край;

Друг пример включва зареждане на външни DLL файлове от вашия код. Всеки път, когато използвате LoadLibrary, трябва да се обадите на FreeLibrary:

Var
dllHandle: THandle;
започвам
dllHandle: = Loadlibrary („MyLibrary“. DLL ');
// направете нещо с тази DLL
ако dllHandle <> 0, тогава FreeLibrary (dllHandle);
край;

Паметта изтича в .NET?

Въпреки че с Delphi за .NET колекторът за боклук (GC) управлява повечето задачи с памет, е възможно да има течове на памет в .NET приложенията. Ето дискусия в статия GC в Delphi за .NET.

Как да се борим срещу течовете на паметта

Освен писането на модулен код, защитен от памет, предотвратяването на изтичане на памет може да се извърши, като се използват някои от наличните инструменти на трети страни. Delphi Инструменти за поправяне на течове на памет да ви помогне да хванете приложението Delphi грешки като повреда в паметта, изтичане на памет, грешки при разпределяне на паметта, грешки при инициализация на променливи, конфликти с променлива дефиниция, грешки в показалеца и други.

instagram story viewer