pointer in c++

کار با حافظه در سی پلاس پلاس خیلی خوبه و خیلی بده!

pointer in c++

زبان سی پلاس پلاس به خاطر وجود Pointer و … امکانات خیلی خوبی در اختیار  برنامه نویس قرار می دهد به طوری که  می تواند شخصا  حافظه را برای برنامه اش کنترل کند و از هزینه ی اضافی زمان و حافظه بکاهد، زبان هایی که  اجازه ی مدیریت حافظه را نمی دهند، خود این کار را می کنند که این کار هم مسلما یک سری ساختمان داده و الگوریتم نیاز دارد که از نظر زمان و هم از نظر حافظه هزینه بر است و مواردی که زمان و حافظه برنامه مهم باشد مسلما راحتی استفاده شان به سنگینی شان نمی ارزد!
از این نظر سی پلاس پلاس خیلی خوب است چون مدیریت حافظه را خود برنامه نویس در برنامه اش انجام می دهد. ولی این کار اصلا آسان نیست مخصوصا اگر پای برنامه های بزرگ و یا برنامه هایی که همروند هستند در وسط باشد! آن موقع کوچک ترین اشتباهی در رابطه با مدیریت حافظه می تواند بسیار هزینه بر باشد و کل برنامه را از کار بیاندازد! بدی این اشتباهات هم معمولا این است که به راحتی قابل شناسایی نیستند حتی بعد از رخ دادن ارور! و یا ممکن است برنامه ی شما با دیتاهای زیادی درست کار کند ولی در یک مورد بخصوص حالتی پیش بیاد که موجب مشکل در حافظه شود.

در ادامه چند مورد از این مشکلات را بررسی می کنیم.

 

کد زیر را نگاه کنید

 

کد بالا جهت نشان دادن حالت کلی است که به آن Dangling pointer می گویند، a یک پوینتر است که برایش یک قسمت از حافظه را گرفته ایم و به آن اختصاص داده ایم و در خط بعدش آدرس آن قسمت از حافظه را که در a قرار گرفته است را در اشاره گر b قرار می دهیم یعنی b هم به همان قسمت از حافظه اشاره می کند. در خط بعد حافظه ای را که به a داده ایم را آزاد می کنیم یعنی آن حافظه دیگر بخشی از برنامه ی ما نیست! ولی اینجا مشکل Dangling pointer رخ می دهد ، b هم چنان دارد به آن قسمت از حافظه اشاره می کند در حالی که آن قسمت از حافظه دیگر بخشی از حافظه ای که برای برنامه گرفته شده است نیست و ما بعد از delete a نمی دانیم چه اتفاقی برای آن قسمت از حافظه افتاده است.

که ممکن است موجب ارور و بسته شدن برنامه شود و یا اینکه موجب این شود که یک سری اطلاعات متفاوت از آن چیزی که ما مد نظرمان است مورد دسترسی قرار بگیرد.

 

یا این یک خط کد سی پلاس پلاس را ببینید:

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

همین اشتباه باعث شد که برنامه ای که باید ۵۰MB حافظه می گرفت ۷۰۰MB حافظه بگیرد! و چون آن برنامه برای پردازش یک سری داده های زیاد و ساختن یک سری ساختمان داده ی پیچیده بود در ابتدا اصلا متوجه نشدم که مشکلی وجود دارد! بعد از اینکه فهمیدم زیادی حافظه مصرف می کند مجبور شدم خط به خط کد را بخوانم و از آنجایی که زیاد از پوینتر ها در برنامه استفاده کرده بودم، پیدا کردن این مشکل یک روز کامل وقت برد!

از این دست مشکلات در رابطه با مدیریت حافظه توی سی پلاس پلاس زیاد است! ولی برای بعضی از آن ها درمان وجود دارد ! برای رفع بعضی از این مشکلات می توان از smart pointer ها (اشاره گر های هوشمند) استفاده کرد، که از ویزگی های جدید سی پلاس پلاس در استاندارد C++ 11 است که در پست بعد چند مورد از طریقه ی استفاده ی آن ها را  خواهیم دید.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

یک دیدگاه

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *