سلام به دوستان عزیز.
نیت کرده بودم پست ی در مورد Memory Leak بنویسم و در این پست بیشتر باابن باگ آشنا میشیم و حرف میزنیم و کدها بصورت Native code و دلفی هستش (بخش اول) که بعدا سراغ managed code ها هم میریم (بخش دوم).
وقتی که یک برنامه فضایی از حافظه رو در اختیار میگیره و به خودش اختصاص میده، مثلا ساخت یک نمونه از کلاس ها و ... اگر نتونه اون فضای اختصاص یافته رو آزاد کنه این باگ اتفاق میافته که ممکن است با اجرای زیاد برنامه فضای زیادی از حافظه اشغال شده و ازاد نشه و با کمبود حافظه مواجه بشیم. این باگ توسط برنامه نویس قابل رفع هست. نمونه خیلی ساده که بگم نوشتن برنامه multi-thread اگر به درستی نتونید ترید های ساخته شده رو free کنید حافظه بیخود اشغال میشه.
این باگ رو برای برای موارد خاصی در نظر میگیریم ، مثلا برنامه هایی که در سرور ها اجرا میشن و ممکن است چندسال در حال جرا باشند که اگر همچین باگی در برنامه باشد بعد ازمدتی کل کارها میخابه بعلت اشغال حافظه بیخود و شاید به حد ریستارت نمودن کل سیستم بکشه.
بزارین با یک سورس کد بهتر متوجه بشیم که چگونه این باگ اتفاق میافته، در زیر یک سورس ساده از دلفی هست
procedure PrintFile(const fileName : string); var myFile : TextFile; fileData : TStringList; i : Integer; begin // Create the TSTringList object fileData := TStringList.Create; // This allocates object memory // Load the file contents into the string list fileData.LoadFromFile(fileName); // Expands the object memory size // Open a printer file AssignPrn(myFile); // Now prepare to write to the printer ReWrite(myFile); // Write the lines of the file to the printer for i := 0 to fileData.Count-1 do WriteLn(myFile, fileData[i]); // Close the print file CloseFile(myFile); end;
به نظرتون باگ memory leak کجا داره اتفاق میافته؟