PDA

View Full Version : insufficent memory???



Roozbeh
دوشنبه 04 اردیبهشت 1385, 05:10 صبح
سلام
برای من وقتی یک برنامه رو چند بار اجرا میکنم و دز این بین خطا میده بعد این پیغام میاد و مجبور میشم از سی بیلدر خارج شم و دوباره وارد شم.
'
insufficent memory for this operation.aliase:dcdemos'
راهنمایی کنید لطفا.

saeedIRHA
سه شنبه 05 اردیبهشت 1385, 07:59 صبح
سلام،
اگر یک مقدار از کدت رو میتونستی بدی راحت تر میشد فهمید ولی فک کنم ،
memory رو که در Heap برای برنامت Allocate کردی خالیش نمکنی!
چون متغیر ها در Heap مثله Stack نیستن که بعد از اجرای برنامت خالی بشن و باید خودت خالیشون کنی!
اگر هم داری Class خاصی مینویسی که memory باید Allocate کنه از "Destructors" اون Class برای
خالی کردن حافظه استفاده کن که بعد از اجرا شدنش این کارو برات انجام میده .
البته این مسئله میتونه یکی از دلایل باشه نمیشه صد در صد گفت تا خوده کد رو آدم نبینه،
موفق باشی.

Roozbeh
سه شنبه 05 اردیبهشت 1385, 14:55 عصر
saeedIRHA جان مرسی
توضیح دقیق رو در این تاپیک یکی از هم کلاسیهام نوشته:
http://www.barnamenevis.org/forum/showthread.php?t=43772
منظور شما اینه که این کد ها رو در روت پیدا کنم و مقدارشون رو برابر صفر قرارا بدم؟
امکانش هست دقیق تر توضیح بدید در کجا و چطوری؟آیا این همان خالی کردن مموریه؟
سپاسگزارم.

saeedIRHA
سه شنبه 05 اردیبهشت 1385, 17:26 عصر
سلام دوست عزیز،
گفتم من نمیتونم دقیق بهت بگم اما طبق چیزی که میدونم ممکنه این باشه،
وقتی که از Pointer یا همون اشاره گر در برنامت استفاده کنی و بخوای براش حافظه
اشغال (Allocate) کنی،
در حقیقت در Heap براش این فضا رو اشغال کردی، که از خصوصیاتش اینکه این حافظه به صورت
Dynamic هست و متونه در هنگام اجرا تغییر کنه و میتونه حافظه مورده نیازت در زمان اجرا با توجه
به شرایط که بخوای رو برات اشغال کنه.
و اما حافظه هایه که به صورت Static اشغال میشن در Stack هستن (مثلاً Array ها) که بعد از اتمام برنامت
این حافظه به صورت خودکار پاک میشه و مشکلی اینجاد نمیکنه اما خوب فرقش اینکه اون انعتاف پذیری رو نداره.
یکی از صفات اشغال کردن حافظه در Heap توسط pointer اینکه شما خودت
باید حافظه رو هر موقع که میخوای خالی کنی
و اگر اینکارو نکنی بعد از اتمام برنامت این حافظه همینطوری پر میمونه و بعد از چند بار باعث میشه که یک رخنه حافظه (Memory Leak) رخ بده و برنامت دیگه نتونه تو Heap برای خودش memory اشغال کنه که در نتیجه یک Exception برمیگردنه.
برای خالی کردن Pointer که در Heap براش حافظه اشغال کردی
در C میتونی از تابع ()free استفاده کنی و در ++C میتونی از تابع ()delete استفاده کنی.

در ضمن اینکه اینو با صفر مقدار دهی کنی برای اینکه حافظه رو آزاد کنی غلط هست،
چون همون جور که میدنی خوده صفر مقدار هست و اگر مثلاً مساوی با صفر قرار بدی
با توجه به موقعیت Pointer ات اون خانه با صفر پر میشه،و اینکار کاملاً غلط و اشتباه هست!!!

اگر بازم سؤال داشتی تا اونجا که بلد باشم در خدمتم.
موفق باشی.

Roozbeh
چهارشنبه 06 اردیبهشت 1385, 06:47 صبح
saeedIRHA جان سپاسگزارم
فقط میخوام بدونم در سی بیلدر هم همان تابع ()delete رو باید استفاده کنم یا نه و اگر بله ،در کجا و چطوری باید بنویسم ؟
ممنونم از شما و امیدوارم شما هم موفق باشی.

saeedIRHA
چهارشنبه 06 اردیبهشت 1385, 08:48 صبح
تابع ()delete از توابع Standard در ++C هستش و توسط هر Compiler ی که Standard باشه
منجمله Borland پشتیبانی میشه.
در مورده نحوه استفاده کردن ازش هم طریقه استفاده کردن Pointer ها و طریقه اشغال کردن
فضا در حافظه براشون رو مطالعه کن.
موفق باشی.

Roozbeh
چهارشنبه 06 اردیبهشت 1385, 17:45 عصر
saeedIRHA جان
سپاسگزارم.