تازه های سایت

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

سلام دوستان

مقدمه

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

شاید خیلی براتون پیش اومده که یهویی برنامه تون بسته میشه. هیشکی هم دلیلش رو نمیدونه. ولی غالبا وقتی با ویژوال استودیو یا هر ابزار دیگه ای خطایابی میکنیم میرسیم به موجود مخوفی به نام اشاره گر یا بلاد کفریش Pointer .

کار کردن با اشاره گر ها دقت زیادی میخواد و گاهی حتی همون دقت زیادم جواب گو نیست.

انواع گرفتن حافظه در سی پلاس پلاس

حتما میدونیم که دو نوع گرفتن حافظه در سی پلاس پلاس وجود داره : استاتیک و داینامیک.

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

این که متغیری که به صورت

رو کی آزادش کنیم با delete شاید برخی مواقع قابل تشخیص نباشه.

آیا راه ساده تری برای مدیریت حافظه عست ؟ بله عست!

راه های مدیریت حافظه در کیوت

یکی از راههای مدیریت حافظه که شاید خیلی استفاده ش کردید ولی متوجه ش نبودید ارتباط پدر و فرزندی در کیوت هستش. زمانی که شما برای یه شی پدر تعیین میکنید و پدر از بین میره فرزند رو هم حذف میکنه. البته با این شرط که پدر و فرزند از جنس QObject باشن ( ینی از این کلاس ارث برده باشن به نوعی)

مثلا وقتی شما یه QWidget طراحی میکنید و این QWidget یه  سری دکمه و لاین ادیت روش داره وقتی خود QWidget رو حذف کنید تمام عناصر روی فرم هم delete خواهند شد.

راه دیگه برای مدیریت حافظه کلاس هایی که از جنس QObject نیستن استفاده از اشاره گر های هوشمند هستش. که قبل از این که مفهومی کیوتی ای باشه مفهومی سی پلاس پلاسی است.

منظور ازاشاره گر هوشمند اشاره گری است که اونقدر درکش رو داره که بدونه کی باید حذف بشه و خودش خودش رو حذف کنه!

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

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

منظور از بلاک یک متغیر جفت {} است که متغیر داخل اون تعریف شده و محدوده عمر یک متغیر که به شیوه داینامیک گرفته نشده است در پایان { خواهد بود.

خب بذارید یه کلاس ساده به صورت زیر تعریف کنیم:

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

بعد توی Task Manager وضعیت حافظه برنامه رو چک کنید . حالا هی روی دکمه کلیک کنید و متوجه خواهید شد که حافظه اختصاص داده شده به برنامه مرتبا زیاد و زیاد خواهد شد.

plainptrخب حالا یه دکمه دیگه بذارید و کد زیر رو توش بنویسید:

در کد بالا از کلاس QScopedPointer استفاده کردیم و یه ابجکت از Haminjuri ساختیم. الان بازم با اینکه new کردیم ولی در پایان بلاک ( پایان تابع) شی ما ازاد خواهد شد. دقت کنید که الان i دقیقا مث یه اشاره گر هستش ( به لطف اپراتور آورلودینگ !) و عملگرهای * , -> , !  براش قابل استفاده هستند.

smartptr

اگه اهلش باشید متوجه شدید که یه ابزار خیلی خوبی پیدا کردید برای کار با اشاره گر حا نه ها . تازه این اول کاره و مطمئن باشید در ادامه کارهای محیرالعقول تری خواهیم کرد.

۸,۷۱۸ total views, 3 views today

Print Friendly
Facebook0Google+0Twitter0LinkedIn0

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

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

۱۴ نظر

  1. سلام آقا سعید،
    فکر کردم سایت رو واگذار کردید!
    مشتاقانه منتظر مطالب جدیدیم 😉

  2. سلام آقا سعید ممنون خسته نباشیدhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_heart.gif

  3. سلام.
    خیلی ممنون.
    دقیقا یکی از مشکلاتی که من دارم رو مطرح کردین. خیلی متشکر.

  4. دیگه داشتم از سایت نا امید می شدم که مثل قبلنا زدی وسط خال…

  5. سلام.
    به نظر من این سازندگان کیوت خیلی حرفه ای ان !!
    من خودم خواستم یه چیزی شبیه به qobject بسازم که وقتی یه کلاسی ازش ارث ببره و new شه و یه کلاس دیگه از کلاس اول ارث ببره و اون هم new شه و کلاس اولو حذف کنیم کلاس دومم حذف شه.یعنی یه رابطه پدر و فرزندی کامل .
    ارور ها و ادا هایی در میاورد که که اگه بگم پیرهنتونو پاره میکنید و فریاد زنان تا سر حد مرگ سرتونو به کیبورد میکوبین.
    دیگه داشتم فکر میکردم برنامه نویسیو ول کنم و برم بنایی !
    ولش دربارش حرف نزنیم بهتره حالم بد شد.ویییی تنم لریزد !!
    خودت چطوری؟؟این اسپم گیرت منو کشته
    هشت ضربدر چه عددی میشه هفت ؟؟

  6. سلام آقا عالی یعنی فوق العاده اصلا ۲۰ واقعا به درد میخوره  میخوام توی opencv ازش تست بگیرم آخه این کتابخونه خیلی نسبت به حافظه بی شعوره ببینم چه بلایی سرش میاد …..http://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gifhttp://qtips.ir/wp-content/plugins/wp-monalisa/icons/wpml_rose.gif

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

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

*


6 + یک =

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