تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 6 از 6

نام تاپيک: انتقال struct و malloc

  1. #1
    کاربر فعال تالار .Net Msba's Avatar
    تاريخ عضويت
    Dec 2006
    محل سكونت
    ! My Mind
    پست ها
    506

    14 انتقال struct و malloc

    سلام به دوستان.
    من یک struct رو با typedef تعریف کردم:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    حالا در برنامه جاهایی من malloc میگرم و پس از یکسری عملیات می خواهم اطلاعات رو به struct منتقل کنم. در توضیح بیشتر یک تابع دارم که خروجی اون ساختار test هست. یک متغیر از test میگیرم و کارهام با اون انجام می دم. در حین این کار ها یک حافظه به data متغیرم اختصاص می دم. حال موقعی که این متغیر رو return می کنم نمی توانم حافظه را free کنم. چرا که اطلاعاتم می پره.
    این free رو کجا باید بنویسم؟
    فرض متد من این طوری باشه:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    جایی در برنامه هم برای فراخوانی اینطوری نوشتم:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    آیا free را باید در فراخوانی بنویسم؟
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    اصلا این روش درست هست؟

  2. #2
    اگه نباشه جاش خالی می مونه p d's Avatar
    تاريخ عضويت
    Apr 2009
    محل سكونت
    قبرستون
    پست ها
    449

    پيش فرض

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

  3. #3
    کاربر فعال تالار .Net Msba's Avatar
    تاريخ عضويت
    Dec 2006
    محل سكونت
    ! My Mind
    پست ها
    506

    پيش فرض

    این رو می دونم دوست عزیز.
    حافظه دریافت شده بالاخره باید برگردد. شاید منظورم واضح نبود.
    من در یک بخشی از برنامه حافظه گرفتم حالا می خواهم پاس بدم یک جای دیگه. حال اونجا باید free کنم؟ اصلا الزامی برای free اون هست؟
    آیا روش من که در بالا استفاده کردم برای دسترسی ها درست هست؟

  4. #4
    کـاربـر بـاسـابـقـه god of war 2's Avatar
    تاريخ عضويت
    Jun 2007
    پست ها
    585

    پيش فرض

    اصلا این روش درست هست؟
    این روش اصلا استاندارد نیست حتی اگر روش مناسبی هم باشد باز هم به این شکل درست نیست.
    بهترین روش برای اینکار استفاده از سازنده و مخرب هست چیزی شبیه زیر هست:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    اما این راه هم هیچوقت توصیه نمیشه چون احتمال به وجود امدن نشت حافظه زیاده.یکی از دلایلش میتونه فراموش کردن برنامه نویس برای آزاد کردن حافظه باشه.
    -------
    برای چیزی که شما نیاز دارید این کار ها اصلا لازم نیست.وقتی شما از یک اشارگر استفاده کردید در هر زمان میتونید هر مقداری رو بهش بدید و اصلا نیازی به گرفتن حافظه نیست.
    کد زیر یک نمونه:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    میتونید رشته هایی هم از نوع const و هم از نوع غیر const بهش نسبت بدید البته نمیتونید مستقیما یک اشارگر const رو بهش ارجا بدید.

    ----
    من در یک بخشی از برنامه حافظه گرفتم حالا می خواهم پاس بدم یک جای دیگه. حال اونجا باید free کنم؟ اصلا الزامی برای free اون هست؟
    حتما هست.فرقی نمیکنه شما کجای برنامتون از حافظه بصورت پویا استفاده کردید.بلافاصله بعد از اینکه کارتون با اون بخش از حافظه تموم شد باید آزاد بشه.
    Last edited by god of war 2; 03-06-2012 at 16:24.

  5. 3 کاربر از god of war 2 بخاطر این مطلب مفید تشکر کرده اند


  6. #5
    کاربر فعال تالار .Net Msba's Avatar
    تاريخ عضويت
    Dec 2006
    محل سكونت
    ! My Mind
    پست ها
    506

    پيش فرض

    ممنون. حال اگر اشاره گری که می خواهم تو اشاره گر struct بریزم خودش malloc شده باشه. اگر بعد از ریختن اشاره گر اولی free شه. آیا اشاره گر درون struct باطل می شه؟

  7. #6
    کـاربـر بـاسـابـقـه god of war 2's Avatar
    تاريخ عضويت
    Jun 2007
    پست ها
    585

    پيش فرض

    ممنون. حال اگر اشاره گری که می خواهم تو اشاره گر struct بریزم خودش malloc شده باشه. اگر بعد از ریختن اشاره گر اولی free شه. آیا اشاره گر درون struct باطل می شه؟
    بله. تمام اشارگر هایی که به اون قسمت از حافظه اشاره میکردند هم معیوب میشن. این کار در برنامه های حساس خیلی میتونه خطر ناک باشه و یک اشتباه کوچیک میتونه باعث کرش شدن کل برنامه بشه.
    فرض کنید چندیدن اشارگر به یک قسمت از حافظه پویا اشاره میکنند.اگر اون حافظه توسط یکی از اشارگر ها آزاد بشه هیچ راهی وجود نداره که اشاره گر های دیگه بتونن این اتفاقو مستقیم تشخیص بدن و اولین تلاش اشارگر برای دسترسی به حافظه آزاد شده = میشه با کرش شدن کل برنامه!
    نسخه قدیمی زبان ++C هیچ راه حلی برای این موضوع نداره اما نسخه جدید و حال حاضر یعنی C++0x یا C++11 از نوعی اشار گر به نام SmartPointer استفاده میکنه که این مشکل رو حل کرده.

  8. 3 کاربر از god of war 2 بخاطر این مطلب مفید تشکر کرده اند


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •