ورود

View Full Version : خطای حافظه EOutOfMemory



www2006
شنبه 28 بهمن 1385, 21:34 عصر
سلام ...
تو برنامه وقتی این خطا اتفاق میفته که برنامه بخواد بصورت داینامیک حافظه بگیره ولی نتونه ..
تو برنامهء من بعد از اجرای یکسری دستور (در رابطه با کار با Stream ها) این خطا رخ میده ..
حالا میخوام بدونم که این کمبود حافظه مربوط به Ram میشه با حافظه های دیگه ( مثلا Heap و..) ؟
و چطور میشه بعد از اجرای دستورات حافظه آزاد بشه تا این خطا اتفاق نیفته .. البته این رو هم بگم من در انتهای کارم با دستور FreeAndNil فضای گرفته شده برای Stream را هم آزاد میکنم ..

توضیح :
دقیقا روی خط Bold شده ، خطا اتفاق میفته (البته بعد از چند بار اجرا ):


LetterBody := TMemoryStream.Create ;
LetterSize := IdTCPClient1.ReadInteger() ;
try
IdTCPClient1.ReadStream(LetterBody,LetterSize,Fals e);
LetterBody.SaveToFile('let.rtf');

RichEdit_LetterView.Lines.LoadFromFile('let.rtf');

finally
FreeAndNil(LetterBody);
end;
با تشکر

vcldeveloper
شنبه 28 بهمن 1385, 23:26 عصر
مطمئن هستید که در یک خط بالاتر از خط Bold شده، همیشه مقدار درستی توسط LetterSize به متد ReadStream ارسال میشه؟

www2006
یک شنبه 29 بهمن 1385, 20:48 عصر
زدی تو خال استاد ..
تستش کردم ... دقیقا وقتی پیغام Out of Memory ظاهر میشه که مقدار LetterSize یک مقدار نجومی شده باشه .. مثلا وقتی که مقدار درست 1171 است ، مقدار LetterSize برابر 1681153036 شده است . در ضمن اشکال از ارسال سرور نیست .. کلاینت مقدار را اشتباه میخواند ..

به نظر شما این مقدار اضافه بابت چیه !؟

vcldeveloper
دوشنبه 30 بهمن 1385, 07:31 صبح
اشکال از ارسال سرور نیست .. کلاینت مقدار را اشتباه میخواند .
شاید قبل از درخواست دریافت عدد مورد نظر، کلاینت درخواست دیگه ایی هم ارسال کرده باشه که قبل از رسیدن جواب درخواست اول سعی میکنه جواب درخواست دوم را بگیره. می تونید قبل از خوندن عدد، یک مقدار کوچک به سرور ارسال کنید و از سرور بخواید که اونو دوباره برای شما ارسال کنه. زمانی که مقدار مورد نظر از سرور ارسال شد و برابر با همون مقدار ارسال شده بود، می تونید درخواست دریافت عدد را ارسال کنید و منتظر جواب سرور باشید.