ايران ويج

نسخه‌ی کامل: delete pointer
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
به نظر شما متغیر 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 هست و معمولا با این مشکل ها توش نیست !