تازه های سایت

اشاره گر های باهوش ( قسمت دوم )

سلام دوستان در قسمت قبلی اشاره گر های باهوش در مورد QScopedPointer صبحت کردیم که زمانی که از محدوده بلاکی که توش تعریف کرده بودیم بیرون میرفتیم میزد اشاره گرش رو حذف میکرد.

حالا سناریو زیر رو در نظر بگیرید:

فرض کنید یه دیتای مثلا یک کیلو بایتی در هر ثانیه براتون از یه منبعی میاد و شما باید اون رو به سه تا thread بدید واسه پروسس.هر تردی یه کاری روی اون دیتا میکنه. حالا کی کار این ۳ تا thread با این دیتا تموم میشه تا حذفش کنیم؟ نمیشه حدس زد. در کل برای حذف این یک کیلو بایت دیتا کارمون یکم سخته. اینجاس که پای QSharedPointer به کلاس های جدید اشاره گرهای باهوشی که بحث خواهیم کرد باز خواهد شد.

در صورتی که چندین قسمت از برنامه قرار است با یک اشاره گر کار کنند و مشخص نیست کار آنها کی تمام میشود تا اشاره گر اصلی را حذف کنیم بهتر است از کلاس QSharedPointer استفاده کنیم تا در فرصت مقتضی به صورت خودکار حذف بشه.

بذارید مثال زیر رو بزنم تا مفهوم اشاره گر اشتراکی خیلی همچین قشنگ دستتون بیاد:

فرض کنید سه نفر قراره توی یه سالنی کار کنن. این سه نفر در سه پارتیشن مجزا کار میکنن و قراره نفر آخر که داره از سالن میره بیرون برق رو خاموش کنه و بره. در ضمن نباید مزاحم بقیه بشه تا بفهمه بقیه هستند یا رفتند. خب چیکار میشه کرد؟ میشه یه وایت بورد تهیه کرد و نفر اول که اومد داخل یه دونه یک رو تخته بنویسه. نفر دوم که اومد یک رو دو کنه و نفر سوم هم دو رو سه. (مشخص کنیم چند نفر الان داخل سالن هستند )

حالا وقت رفتن نفر اولی ( لزوما نفر اولی نیست که اومده ) میاد و سه رو روی تخته یکی ازش کم میکنه و میره . نفر دوم که میخواد بره میبینه روی تخته نوشته دو پس متوجه میشه غیر خودش هنوز یکی دیگه هست و نباید برقارو خاموش کنه. پس فقط عدد روی تخته رو یک میکنه و میره. نفر سوم میاد میبینه عه!! فقط خودش مونده. برقا رو خاموش میکنه و میره. به همین سادگی!

خب این سه نفر سه تا QSharedPointer هستند که به یک دیتای واحد ( از طریق اشاره گر ) دسترسی دارند و در ضمن یک شمارنده داخلی یا Reference دارند که نشون میده چند نفر فعلا از دیتای اصلی دارند استفاده میکنن. زمانیکه یکی از این QSharedPinter ها از بین بره اون شمارنده یکی کم میشه و آخرین کسی که داره از بین میره دیتای اصلی رو هم حذف میکنه.

sharedpointerبذارید یه کد ساده در این رابطه ببینیم و در جلسه بعد مثال عملی thread ها رو با هم بنویسیم.

تیکه کد ساده زیر رو در نظر بگیرید:

فرض کنید یه کلاس خیلی ساده داریم به نام MyData که مثل قبل توی سازنده اش یه دیتای حدود یه مگابایتی گرفته میشه و بعد در مخربش (Destructor) این دیتا حذف میشه.

خب حالا کد اصلی که خیلی هم پیچیده نیست  رو ببینید:

خط اول و دوم و سوم که هیچی نیستند و تعریف تابع مین و اینا هستند که کاری باهاشون نداریم.

یه نکته مهم اینه که شما هرچقدر هم که دلتون خواست توی سی پلاس پلاس میتونید scope یا محدوده های تو در تو ایجاد کنید ( با {} ) و متغیری که داخل یه اسکوپ تعریف بشه در پایانش حذف خواهد شد. خب ما اینجا سه تا اسکوپ الکی ایجاد کردیم که توی هر کدوم یه QSharedPointer میسازیم. میخواهیم ببینیم در انتهای هر اسکوپ که QSharedPointer از بین میره ببینیم چه اتفاقی می افته. در ابتدای اسکوپ اول دیتای اصلی رو که از جنس MyData هست دقیقا مثل QScopedPointer میسازیمش

خب الان شما میتونید خیلی راحت از طریق sptr به اشاره گر MyData دسترسی داشته باشید و به طبع دیتای اون رو بخونید.

در اسکوپ بعدی بازم یه QSharedPointer جدید میسازیم ( نفر دوم وارد سالن شد ! ) ولی به نحوه ساخته شدنش دقت کنید :

دقت کنید دیگه به جای new کردن باید QSharedPointer جدید رو از روی QSharedPointer قبلی بسازیم.چون اگه بازم New کنیم در واقع یه MyData جدید ساختیم و دیگه اینجا چیزی به نام اشتراک معنی نخواهد داشت. با ساختن sptr2 از روی sptr در واقع الان sptr2 هم همون اشاره گر MyData ای رو خواهد داشت که sptr داره.

و همین طور QSharedPointer سوم :

بازم تاکید میکنم الان شما با sptr3 هم به همون اشاره گر MyData ای که stpr , sptr2 داشتند دسترسی دارید و خیلی راحت میتوید با دستور :

به متغیر data داخل اشاره گر به شی کلاس MyData دسترسی داشته باشید ( البته ندارید چون data پرایوت هستش !  P: )

خب بریم سراغ خط بعدی :

خب اینجا جایی است که قراره sptr3 از بین بره ( نفر اول از سالن خارج بشه ) خب باید به نظرتون MyData ای که new شده و بین sptr, sptr2, sptr3 مشترک هست رو حذفش کنه . البته که نه! چون هنوز sptr2 , sptr دارن ازش استفاده میکنن. پس خیلی بی سر و صدا یکی از اون شمارنده ای که گفتیم کم میکنه و میره.

و اما خط بعد:

خب این خطم مث بالا فقط میگه من رفتم و تمام !

ولی خط های بعدی خیلی مهم میشن:

خب ما با چاپ کردن یه متن به نوعی مشخص میکنیم الان قبل از بین رفتن sptr هستیم ! بعد در انتهای scope 1 متغیر sptr هم از بین میره و چون دیگه کسی توی سالن نیست باید برقا رو خاموش کنه . و به این ترتیب میزنه MyData ایکه new شده رو از بین میبره.

خروجی برنامه جالبه :

ctr called.

we are here ! 😀

dctr called.

Now we are here ! 😛 

توی خط اول نشون میده که سازنده کلاس MyData صدا زده شده . کی ؟! زمانی که داشتیم شی sptr رو میساختیم.

خط دوم و چهارم نشان دهنده قبل و بعد از تمام شدن بلاک اول هستند. و میبینید بعد از اینکه بلاک یک تموم شده مخرب یا destructor کلاس MyData هم روی شی ای که قبلا ساخته شده صدا زده شده و به این ترتیب هدر رفت حافظه نداریم.

نکته مهم اینه که طبیعیه با یه بار خوندن این اموزش نشه درکش کرد. در ضمن اگه اصلا احساس نیاز به اشاره گر هوشمند نکردید و یا اصلا تاحالا با اشاره گر ها مشکلی نداشتید یا کلا اصاب اشاره گر ها رو ندارید بی خیال این اموزش بشید.

۷,۵۲۴ total views, 20 views today

Print Friendly
Facebook0Google+0Twitter0LinkedIn0

درباره‌ی سعید دادخواه

دانشجوی سال آخر دانشگاه صنعتی اصفهان هستم. عاشق کیوت! خیلی ها بهم میگن QSaeed :) ولی در کل عاشق کامپیوترم ! سعی کردم هرچیزی رو توی دنیای بی انتهای کامپیوتر تجربه کنم! هر چیزی رو !

۱۴ نظر

  1. هروقت نام اشاره گر ها میاد ، استفراغم میاد 😐
    جاوا کار ها و C# کار ها دارن کیف میکنن برا خودشونو هر روز چه چیزایی که  یاد نمیگیرن.
    ماهم هنوز با این اشاره گر ها درگیریم.کم کم دارم فکر میکنم برم دلفی کار کنم

  2. در ضمن حال کردم دیدم وبسایتت رو داری بروز میکنی.امیدوارم 
    هیچ وقت دیگه مثل گذشته وبسایتو تعطیل نکنی 

  3. بسیار عالی مثل همیشه

  4. bravoo
    excellent
    ترکوندی…مثل همیشه…
     

  5. سلام.
    مثالی که اول پست گذاشتید مفهوم رو کاملا رسوند. بقیه اش که سینتکس هست.
    خیلی عالی بود.

  6. سلام

    ۱-      تشکر

    ۲-      این مثال مربوطه من رو کشت! ابداع خودت بود؟

    ۳-      این شکل­ها هم من رو کشت!

    ۴-      با فرض شوخی بودن کشته شدن در شماره­ها­ی قبل، این تگ­های HTML من رو کشت که در بعضی مواقع که خود دانی، کد رو درست نشون نمی­ده.

    ۵-      این ctr و dctr هم من رو کشت!

    ۶-      اینطوری فکر کن که حداقل یکی “اصاب” این چیزا رو داره!

    ۷-      منتظرمثال thread هستیم. چون خودت گفتی­ها!

    ۸-      قبلا یعنی وقتی جوان بودم، گفتم که اگر هر روز (الان می­گم هر هفته تا ببینم میانسالی چی می­گم!)، یه مطلب به ما یاد بدهی خیلی خوبه. البته اگر خودم بودم، این کار رو نمی­کردم!!!

    ۹-      چرا وقتی صفحه رو ذخیره می­کنم، اپرای دوست داشتنی (البته نسخه قدیمی دارم، بگذار رو حساب تنبلی)، gif رو ذخیره نمی­کنه و نشون نمی­ده!

    ۱۰-   کلا در این پست من خیلی کشته شدم!

    ۱۱-   باز هم تشکر

    • سلام
      ۱-خواهش میکنم
      ۲-بعله ^_^
      ۳-^__^
      ۴-بله حق با شماست باید برم سراغ یه پلاگین دیگه
      ۵-^___^
      ۶-خب امید وار شدم.
      ۷-آره اصن واسه ترد نوشتم اول ولی خب بعد دیدم خیلی غامضس گفتم اول ساده تر برم بعد ترد ها
      ۸-بابا اخه ۶۳ سال هم مگه سن و سال حساب میشه.
      ۸٫۵ – آقا ما هنوز منتظر شیر پسته ایم :))
      ۹-
      ۱۰-شیر پسته لطفا قبل کشته شدن
      ۱۱-خواهش میکنم.

جوابی بنویسید

ایمیل شما نشر نخواهد شد.خانه های ضروری نشانه گذاری شده است. *

*


× دو = 14

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> <img src="" alt="" class="" width="" height="">

http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_bye.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_good.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_negative.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_scratch.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_wacko.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_yahoo.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_cool.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_heart.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_smile.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_whistle3.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_yes.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_cry.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_mail.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_sad.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_unsure.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_wink.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wmpl_laughing.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_angry.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_bigsmile.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_bigsup.gif 
http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_hopless.gif