امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
delete pointer
نویسنده پیام
marvel_vcpp آفلاین
كاربر تک ستاره
*

ارسال‌ها: 35
موضوع‌ها: 6
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 0
( 0 تشکر در 0 ارسال )
ارسال: #1
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;
    }

ما زنده به آنیم که آرام نگیریم موجیم که آسودگی ما عدم ماست
(آخرین ویرایش در این ارسال: ۰۵-دى-۱۳۸۵, ۱۵:۵۶:۱۲، توسط marvel_vcpp.)
۰۵-دى-۱۳۸۵, ۱۵:۵۴:۲۸
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #2
RE: delete pointer
من موندم این کد شما چیکار میکنه !! یه حلقه ب انتها !!! آخه وقتی واسه ch صد تا جا در نظر گرفتی چطور یه مقدار دیگه به انتهاش اضافه می کنی که از حدود صدتا خارج بشه . کلا delete[] ch نمیتونه کل حافظه استفاده شده رو به سیستم برگردونه !
راستی بطور کل delete توی ++C بی خطر هست پس لازم نیست چک کنی که اشاره گر NULL هست یا نه مثل (if(achData ! شما اصلا delete رو روی یک اشاره گر NULL امتحان کن ! اتفاقی نمیافته !

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
۰۶-دى-۱۳۸۵, ۱۷:۳۳:۳۲
ارسال‌ها
پاسخ
تشکر شده توسط : فاطمه وطن دوست
marvel_vcpp آفلاین
كاربر تک ستاره
*

ارسال‌ها: 35
موضوع‌ها: 6
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 0
( 0 تشکر در 0 ارسال )
ارسال: #3
RE: delete pointer
نقل قول: راستی بطور کل delete توی ++C بی خطر هست پس لازم نیست چک کنی که اشاره گر NULL هست یا نه مثل (if(achData ! شما اصلا delete رو روی یک اشاره گر NULL امتحان کن ! اتفاقی نمیافته !
ممنون از راهنمایی مفیدت

من این کد را برای مثال نوشتم به طور کلی سوال من اینه:
معمولا هر اشاره گری که new میشه باید delete بشه ، درسته؟
حالا گاهی اوقات اتفاق می افته که یه اشاره گر new می کنیم و از این اشاره گر داخل یک حلقه بی نهایت استفاده می کنیم. چون این حلقه بی پایانه اگر بعد از حلقه for بخواهیم delete کنیم، هرگز delete نمیشه و داخل حلقه هم نباید delete کنیم چون به مقدار آن نیاز داریم.ازطرفی هم این اشاره گر حتما باید خارج از حلقه new و مقدار دهی بشه.

با این توصیفات یعنی لازم نیست این اشاره گر delete بشه؟

ما زنده به آنیم که آرام نگیریم موجیم که آسودگی ما عدم ماست
۱۳-دى-۱۳۸۵, ۱۶:۱۰:۵۹
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #4
RE: delete pointer
دوست من سلام

ببین بطور کل یکی از مشکلاتی که ++C برای برنامه نویسان ایجاد میکنه همینه ! تمام مدیریت حافظه بر عهده شماست و هر گونه راه حل واسه یه مشکل توسط خودت باید ارائه بشه !
شما کلا نباید بیای و یه همچون کدی رو بنویسی ! اگر بنویسی دیگه delete کردنش قابل انجام نیست چون شما در هر اجرای حلقه یه مقدار فضای حافظه رو میگیری و آدرسش رو هم از دست میدی . مثلا یه راه حل اینه که بیای و یه همچین موقعیت هایی رو اینطور کنترل کنی : یک آرایه از pointer های که از حافظه میگیری بسازی بعد در آخر همه رو با کمک اون delete کنی .

نکته بعدی اینکه تمام اشاره گر ها باید و باید delete کنی و گرنه برنامه شما به مشکلی به نام Memory Leak بر میخوره . یعنی کل حافظه سیستم توسط برنامه شما به هدر میره و سیستم هنگ میکنه . تو ++C این مشکل زیاد پیش میاد برای همین مایکروسافت زبان جدیدی با نام ++Managed C رو ارائه کرد که مدیرت حافظه اش بر عهده CLR هست و معمولا با این مشکل ها توش نیست !

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
۱۴-دى-۱۳۸۵, ۱۴:۴۸:۱۹
ارسال‌ها
پاسخ
تشکر شده توسط : فاطمه وطن دوست


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Toungue ???POINTER sh_teta 2 2,057 ۳۰-شهریور-۱۳۸۶, ۱۷:۰۰:۳۹
آخرین ارسال: sh_teta

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS