View Full Version : auto_ptr چیست ؟
Azar.099
یک شنبه 03 فروردین 1393, 20:12 عصر
سلام دوستان
میشه درباره این برام توضیح بدید
ممنون
darknes666
یک شنبه 03 فروردین 1393, 20:25 عصر
یک کلاس موجود در کتابخانه ی C++ هست که ویژگی های Resource Acquisition Is Initialization رو برای اشارگرها تو C++ تامین میکنه.
Azar.099
یک شنبه 03 فروردین 1393, 20:29 عصر
یک کلاس موجود در کتابخانه ی C++ هست که ویژگی های Resource Acquisition Is Initialization رو برای اشارگرها تو C++ تامین میکنه.
http://en.wikipedia.org/wiki/Auto_ptr
دوست عزیز خودم میدونم توی c++11 هم هست
میخوام یک نفر در موردش برام کامل توضیح بده
darknes666
یک شنبه 03 فروردین 1393, 20:34 عصر
قالب کلاس auto_ptr یک شی رو توصیف میکنه که او شی یک اشاره گر رو نگه میداره و اون اشاره گر به یک شی اختصاص داده شده اشاره میکنه.که تضمین میکنه شی اشاره شده به طور خودکار در هنگامی که بررسی که حوزه رو ترک میکنه از بین رفته.
Azar.099
یک شنبه 03 فروردین 1393, 20:50 عصر
که تضمین میکنه شی اشاره شده به طور خودکار در هنگامی که بررسی که حوزه رو ترک میکنه از بین رفته.
یعنی اشاره گریه که وقتی ازش استفاده نمیشه حافظه ای اشغال شده را خودش دیلیت میکنه ؟؟
یا اینکه فقط وقتی حافظه میگیره که ازش استفاده میشه ؟
darknes666
یک شنبه 03 فروردین 1393, 21:05 عصر
بزار یک مثال بزنم برات.auto_ptr چیزی که انجام میده اینه که خودش به صورت خودکار شیی رو که دیگه بهش احتیاج نیست از بین میبره.
مثلا کد زیر رو در نظر بگیر
void fnt()
{
T* pt( new T );
//some codes
delete pt;
}
خیلی از ما ها اینجوری مینویسیم ولی یه مشکل است.اگر تابع به هر دلیلی مثل زود تر برگردوندن مقدار یا هرچیز دیگه دستور delete رو انجام نده اونوقت ما مقداری از حافظه رو میگریم.
حالا اگر با auto_ptr بنویسی اینجوری میشه:
void fnt()
{
auto_ptr<T> pt( new T );
//some codes
}
که خودش تخریب و حذف میشه.
درواقع این کد شی T رو ایجاد نمیکنه.مهم نیست که تابع به طور معمول خارج میشه و یا نه چون در هر صورت تخریب کننده ی pt همیشه صدا میشه هنگامی که stack باز هستش و پاک کردن به طور اوتوماتیک انجام میشه.
rahnema1
یک شنبه 03 فروردین 1393, 23:54 عصر
auto_ptr اگرچه هنوز پشتیبانی میشه اما از نسخه c++11 دیگه منسوخ شده و به جای اون unique_ptr اومده
این در چارچوب مفهوم اشاره گرهای هوشمند smart pointers قرار داره که عبارتند از
shared_ptr
weak_ptr
unique_ptr
که هدف استفاده از اینها جلوگیری از به وجود آمدن باگ و نشت حافظه در برنامه هست
از جمله موارد نشت حافظه وقتی هست که ما در یک تابع مقداری حافظه را به صورت پویا اشغال کرده باشیم ولی اون را در انتهای تابع free نکنیم این کار باعث میشه حافظه تا انتهای اجرای برنامه اشغال بمونه اما ما توانایی استفاده از اون را نداشته باشیم به عبارت دیگه با این کار فقط اشاره گری که به اون قسمت حافظه اشاره کرده از بین رفته ولی حافظه مورد نظر آزاد نمیشه
با استفاده از اشاره گر های هوشمند همون طور که دوستمون اشاره کردند دیگه نگران نیستیم که شیء مورد نظر در حافظه مونده یانه بلکه با از بین رفتن اشاره گر حافظه ای که اون اشاره گر بهش اشاره می کنه نیز آزاد میشه
share_ptr برای این منظور به کار میره که چند اشاره گر بتونند به یک شیء اشاره کنند و شیء مورد نظر وقتی از بین میره که آخرین اشاره گر از بین بره
اما weak_ptr مثل shared_ptr اختیار یک شیء را در دست نمی گیره بلگه به عنوان یک مشاهده گر اشیایی که توسط shared_ptr در اختیار گرفته شده اند ازش استفاده میشه با اون میشه فهمید شیئی که تحت نظر گرفته شده وجود داره یا نه . بنابراین weak_ptr با shared_ptr به کار میره
اما unique_ptr همون طور که از اسمش پیدا است تنها یک اشاره گر هوشمند میتونه اختیار یک شیء را به دست بگیره ( به اون اشاره کنه) به محض از بین رفتن اون اشاره گر ، شیء مورد نظر هم از بین میره
این هم یک منبع آموزشی خوب:
http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
همچنین برای اطلاع از جزئیات اینها می تونید به استاندارد هم مراجعه کنید
Azar.099
دوشنبه 04 فروردین 1393, 01:14 صبح
auto_ptr
از جمله موارد نشت حافظه وقتی هست که ما در یک تابع مقداری حافظه را به صورت پویا اشغال کرده باشیم ولی اون را در انتهای تابع free نکنیم این کار باعث میشه حافظه تا انتهای اجرای برنامه اشغال بمونه اما ما توانایی استفاده از اون را نداشته باشیم به عبارت دیگه با این کار فقط اشاره گری که به اون قسمت حافظه اشاره کرده از بین رفته ولی حافظه مورد نظر آزاد نمیشه
با استفاده از اشاره گر های هوشمند همون طور که دوستمون اشاره کردند دیگه نگران نیستیم که شیء مورد نظر در حافظه مونده یانه بلکه با از بین رفتن اشاره گر حافظه ای که اون اشاره گر بهش اشاره می کنه نیز آزاد میشه
یعنی تا الان هرچی از حافظه پویا استفاده میکردیم مطمین نبودیم که وقتی دیلیت میکردیم حافظه مورد نظر ازاد میشه ؟؟؟
http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf (http://www.umich.edu/%7Eeecs381/handouts/C++%E2%80%8E11_smart_ptrs.pdf)
it does't work
rahnema1
دوشنبه 04 فروردین 1393, 09:39 صبح
گفتم که حافظه free بشه یعنی به قول شما delete اجرا بشه مشکلی پیش نمیاد.توی اون مثال که گفتم واسه وقتیه که delete نکنیم
این لینک فولدر اونجا داخلش پی دی اف هست :
http://www.umich.edu/~eecs381/handouts
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.