بازگشت اشاره گر و آدرس از تابع (C++)
در مورد ارسال ارجاع و اشاره گر به تابع در پست های قبلی صحبت کردیم، در این پست بازگشت انها به تابع اولیه را بررسی می کنیم.
فرض کنید Ptr یک اشاره گر باشد که به تابع ارسال شده است؛ با کد زیر مقدار متغیری که Ptr به آن اشاره دارد را به تابع اولیه بازگشت داده می شود.
return *Ptr;
نوع خروجی تابعی که کد بالا در آن استفاده شده است باید مناسب نوع Ptr باشد.
تابع زیر را در نظر بگیرید :
تابع زیر را در نظر بگیرید :
int* power (int input)
{
int num = input*input;
return & num;
}
این تابع بدون خطا کامپایل می شود و در حتی در برخی مواقع درست کار می کند؛ ولی کامپایار به شما هشدار می دهد : "بازگشت آدرس یک متغیر محلی یا موقتی" (returning address of local variable or temporary) . این پیام به شما هشدار می دهد که شما آدرس متغیری را استفاده می کنید که ممکن است همیشه وجود نداشته باشد. به این خاطر متغیر num در تابع power تنها تا زمانی که تابع در حال اجرا است وجود دارد و پس از عبارت return دیگر متغیری به نام num وجود ندارد و فضای اشغال شده توسط آن برای استفاده های دیگر خالی می شود. کد زیر که بخشی از تابع main است، مثالی از این موضوع است :
int* ptr = nullptr;
ptr = power (10);
string str = "hello world!";
cout << *ptr;
ما انتظار داریم که عدد 100 به عنوان خروجی در صفحه ی نمایش چاپ شود، ولی ممکن است با مقداری مواجه شویم که اصلا انتضار آن را نداشته باشیم. اگر خوش شانس باشیم و حافظه ی استفاده شده توسط num پس از نابود شدن آن توسط متغیری دیگری پر نشده باشد ما مقدار صحیحی را در خروجی می بینیم ولی از کجا می توان از این بابت مطمئن بود ؟! پس همیشه قانون کلی و مهم زیر را در نظر داشته باشید :
"هیچ گاه ادرس یک متغیر محلی را به تابع دیگری بر نگردانید"
حالا برای تصحیح تابع بالا چه می توان کرد ؟ خب راه های زیادی برای این کار وجود دارد ولی برای کاری که ما می خواهیم انجام دهیم یکی از انها استفاده از عملگر new برای ایجاد num اختصاص حافظه به آن است. کد زیر این کار را انجام می دهد :
int* power (int input)
{
int* num = new int (input*input);
return num;
}
با ایجاد متغیر num با استفاده از عملگر new ، این متغیر تا زمانی که با عملگر delete آزاد نشود یا برنامه به انتها نرسد، در حافظه باقی می ماند. حالا اگر در تابع main از تابع power استفاده کنیم به نتایج درستی دست پیدا می کنیم و دیگر کامپایلر اخطار بالا را نشان نمی دهد.
ivor horton's "Beginning Visual C++ 2010"
+ نوشته شده در سه شنبه هجدهم بهمن ۱۳۹۰ ساعت 19:39 توسط MEC
GENERAL INFORMATION