اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

آزاد کردن حافظه‌ی مصرفی در تابع

0 امتیاز
82 نمایش

من یه کلاس به اسم C دارم و یه تابع که قراره یه شیء از نوع اون کلاس رو برگردونه. البته با اشاره‌گر. به شکل زیر

const C* f()
{
    C *tmp = new C();
    ...
    return tmp;
}

یه عملگر هم سربارگذاری شده برای انتساب در کلاس C

const C* operator=(const C*);

در این عملگر مقادیر پارامتر ارسالی به تابع به شی‌ء فراخواننده کپی می‌شه نه آدرسش.
در تابع main این کار و می‌کنیم:

C C1;
C1 = f();

اینجا یه مشکلی داریم. در تابع f یه شی ساختیم که حافظه‌شو آزاد نکردیم.
یه تناقضی هست. اگه حافظه بخاد آزاد بشه باید قبل از خاتمه‌ی تابع باشه طبیعتاً. اما قبل از خاتمه‌ی تابع اگه حافظه آزاد بشه چطوری برگردونیم‌ش بیرون؟

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پرسیده شده سه شنبه ۲۰ فروردین ۱۳۹۲ در C++ توسط prodo  

1 پاسخ

0 امتیاز

بستگی به پیاده‌سازی عملگر = داره. اگه بعد از انتساب آدرس Rvalue و Lvalue یکی هست (یعنی انتساب آدرس رو منتقل می‌کنه) دیگه نیازی به آزاد کردن حافظه نیست چون اون حافظه الان در اختیار C1 هست و هر زمان که لازم شد می‌شه حذفش کرد.

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

C C1, C2;
C1 = C2;

بنابراین این راه خوبی نباید باشه در صورتی که اگه یه برنامه‌ی کوچک دارین و قابل کنترل هست این راه قابل اعمال هست.

راه دیگه پیاده‌سازی انتساب به صورت زیر هست

const C* operator=(const C&);

و بعد استفاده از انتساب به این صورت

C C1, *tmp;
tmp = f();
C1 = *tmp;
delete tmp;
هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده چهارشنبه ۱۹ تیر ۱۳۹۲ توسط prodo