السلام عليكم .
أواجه حاليا في برامجي " العادية" استزاف شديد للذاكرة .(أتوقع هذا ما يعرف بالMemory leaks . . وبشكل شنيع .)
لدرجة انه " لعبة صغيرة " تستنزف حوالي 200 ميقا بايت .. مع مرور الوقت .
حيث عندما تبدأ اللعبة .. تكون المساحة المحجوزة من الذاكرة ( ا ميقا تقريبا) .. ومع مرور الوقت وأنا قاعد اشغل اللعبة واراقب استهلاك الذاكرة من خلال " مدير المهام" التابع للويندوز .. الاحظ انه في كل LOOP.. تزداد الذاكرة المحجوزة لبرنامجي بمقدار 300 كيلو بايت ( وأحيانا تكون الزيادة عشوائية) .
قمت بتتبع البرنامج .. وحذف والغاء متغيرات واكتشفت التالي " يعني عرفت المشكلة لكن بقي الحل " :
المشكلة :
اللعبة تستخدم حلقة تكرارية while .
في كل loop .. استدعي دالة تقوم بحجز مؤشر ..
سأضع الاكواد باختصار :
RECT* get( )
{
RECT *r=new RECT();
r->left=r->right=r->top=r->bottom=12;
return r;
}
int main()
{
while(1)
{
get( );
}
return 0;
}البرنامج يستنزف الذاكرة بشكل رهيب ..
أتوقع المشكلة ( والله اعلم) بسبب اني استدعي الدالة get التي تقوم بحجز مؤشر .. وتعمله new . في كل loop .
أنا اللي اعرفه .. انه عندما احجز مؤشر من نفس الاسم ( يتم استبداله بمكان المؤشر السابق )
لكن الظاهر انه المكان اللي يؤشر عليه يبقى محجوز .
لو قمت بتغيير الكود السابق الى هذا :
RECT* get( )
{
RECT r;
r.left=r.right=r.top=r.bottom=12;
return &r;
}
int main()
{
while(1)
{
get( );
}
return 0;
}لبقيت الذاكرة المحجوزة ثابتة . .
سؤالي :
* أنا احتاج لحجز مؤشر داخل function . . وفي كل loop اطلب من الدالة ان تعيد لي المؤشر .
ولكن هذا يستنزف الذاكرة بشكل رهيب .
المشكلة مع الدوال .. اني لما اعمل return للعنوان .. خلاص .. مافيه امكانية لعمل delete للمؤشر من داخل الدالة
* هل يوجد برنامج أو طريقة . . لمعرفة اسم المتغير الذي قام بحجز الذاكرة اثناء التشغيل .. حتى استطيع الوصول اليه بسرعة بدلا من التجارب العشوائية.. واقوم بحل المشكلة .
عندي اسئلة اخرى .. لكن نؤجلها بعدين .
ماهو الحل يا اخوان !


