Блогът на GunSmoker Защо винаги трябва да използвате FreeAndNil вместо Free
. когато промяната на нечий ум става толкова лесна, колкото програмирането на компютър, какво означава да си човек.
Защо винаги трябва да използвате FreeAndNil вместо Free
Това са струпаните публикации, които извадиха този цитат.
Внимание! Постът има за цел да обоснове моята гледна точка: D Искане да се излеят всички негативни проклятия някъде другаде;)
Забележка: ако имате лошо или не разбирате какво представляват указателите и/или обектите, препоръчвам първо да прочетете тази статия.
Нека разгледаме типичен код за създаване и изтриване на обект, както обикновено се дава:
Искам обаче да го покажа обаждането на Free трябва да се избягва, където е възможно, замествайки го с повикване към FreeAndNil, по следния начин:
Имайте предвид, че говорим за замяна на Free с FreeAndNil навсякъде. Не става въпрос само за използване на FreeAndNil, когато искате да тествате референция за нула, но това е напълно и напълно навсякъде. Тези. изобщо никога не пишете Безплатно. Да, включително скриптове с локални променливи.
Защо? Ами причината е проста - няма причина да не се прави това (моля прочетете до края). Но има аргументи срещу използването на Free в тези ситуации.
Обикновено аргументите срещу се дават от следното:
Освен това, защо един външен клас ще изисква нещо от своето поле в момента на изтриване на това поле? Според мен това е логическа грешка в изрична форма (достъп до обект по време на изтриването му, т.е. до частично инициализиран обект). А използването на FreeAndNil просто ще улови такива ситуации. Разбира се, такава ситуация може да се предвиди, но това е напълно грозно (отстъпете настрана, всяка промяна в кода е "извън темата" и вашият код ще спре да работи). Както и да е, такава ситуация не плаващ и покажете се веднага. Тогава спокойно ще се върнете Free на мястото си.
2. Друго възможно възражение: дайте пример за оправдано използване на FreeAndNil .
Не е много ясно какъв пример може да се даде тук. В крайна сметка използването на FreeAndNil вместо Free е абсолютно незадължително действие. Объркващи примери настрана, същият правилен код ще работи абсолютно същото с Free, както и с FreeAndNil .
FreeAndNil е донякъде подобен на предпазните колани: ако бягането се извършваше в нормален режим, те не бяха полезни. Но ако вашият код е грешен някъде в последователността от действия, тогава FreeAndNil (като предпазните колани) ще ви предпази от последствията. Като нулира връзката, FreeAndNil ще ви помогне да хванете лявата препратка веднага, на място. Без него кодът може да продължи изпълнението си и дават неправилен резултат, без да предизвикват грешка. Много е опасно.
Имайте предвид, че въпреки това FreeAndNil е НЕ е панацея, от обектът може да бъде достъпен чрез няколко променливи.
3. FreeAndNil е излишен тук! (локални променливи)
Добре, това беше слаб аргумент. И истинската причина е еднообразието на стила. Удобно, когато навсякъде се пише FreeAndNil вместо Free/FreeAndNil. И вие самите няма да се объркате кога какво да сложите (дори не се нуждаете мисля: "ааа, тук ви трябва FreeAndNil или можете просто безплатно.").
Ако в някои ситуации FreeAndNil наистина е излишен, тогава защо не използвате обаждането Destroy? В крайна сметка Безплатно в много ситуации също излишни (Изобщо никога не съм имал предвид деструктор! Казах: в много случаи. Случаят на изтриване на частично инициализиран обект, разбира се, не е включен в тях).
Имайте предвид, че 99% от кода на Delphi изобщо не извиква деструктора на обекти! Вече сме научени да използваме разговора за безплатна процедура. Но веднъж хората, просто свикнали да пишат „Унищожи навсякъде“, също извикаха: „Защо ни трябва това Безплатно? Нямаме нужда тук! Където е необходимо, ще сложа всичко сам!“ И какво? Пишем ли всичко безплатно сега? (добре, всъщност този пример не е факт, а моята фантазия, тъй като вече започнах да забравям как всъщност беше там, в онези дни. Но лесно мога да си го представя и, изглежда, това изглежда правдоподобно:)).
Е, тук правя кампания, за да направя още една крачка напред: да използвам FreeAndNil вместо Free. В крайна сметка ползите от прехода Free -> FreeAndNil са много повече от предимствата на вече настъпилия преход от Destroy към Free .
В първия случай получаваме автоматична защита срещу плаващи грешки (както казах, това не е панацея, но въпреки това е значителен бонус). Във втория случай получихме само възможността не пишете изрично ако . Защо? Защото, ако изрично извикаме Destroy вместо Free, тогава ще стартираме деструктора със Self = nil, който веднага би довело до AV при първото извикване на полето на обекта. Грешката е напълно не плаващ и лесно за хващане. Тези. това е чисто икономия на време за въвеждане, без допълнителни бонуси. Съгласете се, че бонусът от първия преход ("защита от грешки") много по-значими, от бонуса от втория („пиши по-кратко“). Освен това не можете да загубите бонуса „по-кратко за писане“, като въведете процедура с име F, която просто ще извика FreeAndNil. Или можете да направите LiveTemplate като мен.