مشاهده نسخه کامل
: انتقال struct و malloc
سلام به دوستان.
من یک struct رو با typedef تعریف کردم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا در برنامه جاهایی من malloc میگرم و پس از یکسری عملیات می خواهم اطلاعات رو به struct منتقل کنم. در توضیح بیشتر یک تابع دارم که خروجی اون ساختار test هست. یک متغیر از test میگیرم و کارهام با اون انجام می دم. در حین این کار ها یک حافظه به data متغیرم اختصاص می دم. حال موقعی که این متغیر رو return می کنم نمی توانم حافظه را free کنم. چرا که اطلاعاتم می پره.
این free رو کجا باید بنویسم؟
فرض متد من این طوری باشه:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
جایی در برنامه هم برای فراخوانی اینطوری نوشتم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آیا free را باید در فراخوانی بنویسم؟
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اصلا این روش درست هست؟
نمی توانم حافظه را free کنم. چرا که اطلاعاتم می پره.
وقتی حافطه رو ازاد میکنن ک دیگه نیازی بهش نباشه .پس اصولا اگه بهش نیاز داری نباید ازادش کنی .
این رو می دونم دوست عزیز.
حافظه دریافت شده بالاخره باید برگردد. شاید منظورم واضح نبود.
من در یک بخشی از برنامه حافظه گرفتم حالا می خواهم پاس بدم یک جای دیگه. حال اونجا باید free کنم؟ اصلا الزامی برای free اون هست؟
آیا روش من که در بالا استفاده کردم برای دسترسی ها درست هست؟
god of war 2
03-06-2012, 16:17
اصلا این روش درست هست؟
این روش اصلا استاندارد نیست حتی اگر روش مناسبی هم باشد باز هم به این شکل درست نیست.
بهترین روش برای اینکار استفاده از سازنده و مخرب هست چیزی شبیه زیر هست:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اما این راه هم هیچوقت توصیه نمیشه چون احتمال به وجود امدن نشت حافظه زیاده.یکی از دلایلش میتونه فراموش کردن برنامه نویس برای آزاد کردن حافظه باشه.
-------
برای چیزی که شما نیاز دارید این کار ها اصلا لازم نیست.وقتی شما از یک اشارگر استفاده کردید در هر زمان میتونید هر مقداری رو بهش بدید و اصلا نیازی به گرفتن حافظه نیست.
کد زیر یک نمونه:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
میتونید رشته هایی هم از نوع const و هم از نوع غیر const بهش نسبت بدید البته نمیتونید مستقیما یک اشارگر const رو بهش ارجا بدید.
----
من در یک بخشی از برنامه حافظه گرفتم حالا می خواهم پاس بدم یک جای دیگه. حال اونجا باید free کنم؟ اصلا الزامی برای free اون هست؟
حتما هست.فرقی نمیکنه شما کجای برنامتون از حافظه بصورت پویا استفاده کردید.بلافاصله بعد از اینکه کارتون با اون بخش از حافظه تموم شد باید آزاد بشه.
ممنون. حال اگر اشاره گری که می خواهم تو اشاره گر struct بریزم خودش malloc شده باشه. اگر بعد از ریختن اشاره گر اولی free شه. آیا اشاره گر درون struct باطل می شه؟
god of war 2
03-06-2012, 16:41
ممنون. حال اگر اشاره گری که می خواهم تو اشاره گر struct بریزم خودش malloc شده باشه. اگر بعد از ریختن اشاره گر اولی free شه. آیا اشاره گر درون struct باطل می شه؟
بله. تمام اشارگر هایی که به اون قسمت از حافظه اشاره میکردند هم معیوب میشن. این کار در برنامه های حساس خیلی میتونه خطر ناک باشه و یک اشتباه کوچیک میتونه باعث کرش شدن کل برنامه بشه.
فرض کنید چندیدن اشارگر به یک قسمت از حافظه پویا اشاره میکنند.اگر اون حافظه توسط یکی از اشارگر ها آزاد بشه هیچ راهی وجود نداره که اشاره گر های دیگه بتونن این اتفاقو مستقیم تشخیص بدن و اولین تلاش اشارگر برای دسترسی به حافظه آزاد شده = میشه با کرش شدن کل برنامه!
نسخه قدیمی زبان ++C هیچ راه حلی برای این موضوع نداره اما نسخه جدید و حال حاضر یعنی C++0x یا C++11 از نوعی اشار گر به نام SmartPointer استفاده میکنه که این مشکل رو حل کرده.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.