PDA

View Full Version : کار نکردن delete در GCC



(reza)
سه شنبه 25 آذر 1393, 22:40 عصر
چند وقت پیش code::block 13.12 رو دانلود کردم با کامپایلرش اما وقتی مثلا کد زیر رو مینویسم

#include <iostream>
using namespace std;
int main()
{
double *d = new double(11.5);
delete d;
cout << *d << endl;


return 0;
}



متغیر d حذف نمیشه و مقدارش در خروجی چاپ میشه .
اما همین کد رو تو ویژوال استودیو اجرا کردم متغیر d حدف میشد .
به نظرتون مشکلش چیه ؟؟!!

rahnema1
چهارشنبه 26 آذر 1393, 07:14 صبح
سلام
منظور شما از حذف شدن چیه؟ یعنی صفر چاپ کنه؟ یا برنامه خطا بده؟
ببینید وقتی از new استفاده می کنید بخشی از حافظه را جهت استفاده رزرو می کنید. و اگه بعد از اون هزار بار هم new بزنید ان قسمت از حافظه که رزرو شده برای متغیر دیگری رزرو نخواهد شد
وقتی که delete استفاده کنیم اون قسمت از حافظه دیگه آزاد میشه و مثلا اگه یک new بزنیم ممکنه اون قسمت برای یک متغیر جدید رزرو بشه
وقتی p را delete کردید دیگه آدرسی که توسط p بهش اشاره شده در حالت رزرو نیست و هر نوع دسترسی به اون آدرس منجر به undefined behavior میشه یعنی معلوم نیست چه اتفاقی بیفته یا مقدار قبلی نمایش داده میشه یا یه مقدار دیگه یا runtime error اتفاق بیفته

(reza)
چهارشنبه 26 آذر 1393, 10:44 صبح
بذار با مثال بگم در اینجا d نال میشه و خروجی چاپ نمیشه
#include <iostream>using namespace std;
int main()
{
double *d = new double(11.5);
d = NULL;
if (d)
cout << "hello" << endl;


return 0;
}



خروجی :
هیچی

ولی چرا وقتی از delete استفاده میکنم d همچنان باقی هست ؟

#include <iostream>using namespace std;
int main()
{
double *d = new double(11.5);
delete d;
if (d)
cout << "hello" << endl;


return 0;
}



خروجی :
hello

چیزی که من انتظار دارم اینه که متغیر d نهست بشه در ادامه شرط برقرار شه تا دستور چاپ انجام نشه

سوال اینجاس چرا در مثال دوم دستور چاپ داره انجام میشه ؟ مگه با delete متغییر d از بین نمیره ؟

rahnema1
چهارشنبه 26 آذر 1393, 12:20 عصر
متغیر d اصلا از بین نمیره و تا انتهای تابع حضور داره و فقط یک اشاره گره که به یک جای حافظه اشاره می کنه
وقتی که delete می کنیم اون جایی که d بهش اشاره می کنه آزاد میشه تا در ادامه برنامه ممکنه توسط متغیر دیگری رزرو بشه
شما به معنای تحت اللفظی delete توجهی نکنید
محل d درحافظه stack هست و مدت عمرش هم تا انتهای تابع
مثال زیر را ببینید
در ابتدا d را تعریف می کنیم که یک مقدار دلخواه می گیره یعنی به یک جای دلخواه از حافظه اشاره می کنه
اما وقتی new می زنیم یک فضایی حداقل به اندازه سایز double در حافظه heap رزرو میشه و آدرس اون در d قرار می گیره
بعد از delete اون قسمت حافظه از حالت رزرو خارج میشه اما d کماکان به اون آدرس اشاره می کنه و این آدرسی هست که دسترسی به اون منجر به undefined behavior میشه

#include <iostream>
using namespace std;
int main()
{
double *d;
cout << (unsigned long long) d << endl;
d = new double(11.5);
cout << (unsigned long long) d << endl;
delete d;
cout << (unsigned long long) d << endl;
return 0;
}