سلام
به نظر شما متغیر achData در این کد را کجا باید delete کرد؟
کد:
char* achData=new char[100];//where do delete this pointer?
strcpy(achData,"Hello");//this pointer must initialize out of loop
for(;;)
{
char *ch=new char[100];
strcat(ch,achData);
if(ch)
{
delete[] ch;
ch=NULL;
}
}
if(achData)//This code will not run never
{
delete[] achData;
achData=NULL;
}
من موندم این کد شما چیکار میکنه !! یه حلقه ب انتها !!! آخه وقتی واسه ch صد تا جا در نظر گرفتی چطور یه مقدار دیگه به انتهاش اضافه می کنی که از حدود صدتا خارج بشه . کلا delete[] ch نمیتونه کل حافظه استفاده شده رو به سیستم برگردونه !
راستی بطور کل delete توی ++C بی خطر هست پس لازم نیست چک کنی که اشاره گر NULL هست یا نه مثل (if(achData ! شما اصلا delete رو روی یک اشاره گر NULL امتحان کن ! اتفاقی نمیافته !
نقل قول: راستی بطور کل delete توی ++C بی خطر هست پس لازم نیست چک کنی که اشاره گر NULL هست یا نه مثل (if(achData ! شما اصلا delete رو روی یک اشاره گر NULL امتحان کن ! اتفاقی نمیافته !
ممنون از راهنمایی مفیدت
من این کد را برای مثال نوشتم به طور کلی سوال من اینه:
معمولا هر اشاره گری که new میشه باید delete بشه ، درسته؟
حالا گاهی اوقات اتفاق می افته که یه اشاره گر new می کنیم و از این اشاره گر داخل یک حلقه بی نهایت استفاده می کنیم. چون این حلقه بی پایانه اگر بعد از حلقه for بخواهیم delete کنیم، هرگز delete نمیشه و داخل حلقه هم نباید delete کنیم چون به مقدار آن نیاز داریم.ازطرفی هم این اشاره گر حتما باید خارج از حلقه new و مقدار دهی بشه.
با این توصیفات یعنی لازم نیست این اشاره گر delete بشه؟
دوست من سلام
ببین بطور کل یکی از مشکلاتی که ++C برای برنامه نویسان ایجاد میکنه همینه ! تمام مدیریت حافظه بر عهده شماست و هر گونه راه حل واسه یه مشکل توسط خودت باید ارائه بشه !
شما کلا نباید بیای و یه همچون کدی رو بنویسی ! اگر بنویسی دیگه delete کردنش قابل انجام نیست چون شما در هر اجرای حلقه یه مقدار فضای حافظه رو میگیری و آدرسش رو هم از دست میدی . مثلا یه راه حل اینه که بیای و یه همچین موقعیت هایی رو اینطور کنترل کنی : یک آرایه از pointer های که از حافظه میگیری بسازی بعد در آخر همه رو با کمک اون delete کنی .
نکته بعدی اینکه تمام اشاره گر ها باید و باید delete کنی و گرنه برنامه شما به مشکلی به نام Memory Leak بر میخوره . یعنی کل حافظه سیستم توسط برنامه شما به هدر میره و سیستم هنگ میکنه . تو ++C این مشکل زیاد پیش میاد برای همین مایکروسافت زبان جدیدی با نام ++Managed C رو ارائه کرد که مدیرت حافظه اش بر عهده CLR هست و معمولا با این مشکل ها توش نیست !