PDA

View Full Version : سوالی درباره ی تخصیص به متغیر از نوع پویا



Ninaxin
پنج شنبه 24 مرداد 1392, 18:05 عصر
سلام دوستان.
می خواستم بدونم در سی++ سیستم از کجا می فهمد که مقداری از حافظه به متغیری تخصیص داده شده است؟ به عنوان مثال :
int *p;
p = new int [3] ;
در دستور دوم چه بر سر حافظه پیش می آید که حافظه به متغیر تخصیص داده می شود؟
و یا در دستور زیر :
int *p , *q ;
p = new int [2];
q = p;
delete [] p;

آیا حافظه ای به q اختصاص داده می شود؟
با تشکر از دوستان

مصطفی ساتکی
پنج شنبه 24 مرداد 1392, 19:22 عصر
سلام دوستان.
می خواستم بدونم در سی++ سیستم از کجا می فهمد که مقداری از حافظه به متغیری تخصیص داده شده است؟
allocator table وجود داره .وقتی شما حافظه درخواست می کنی در ابتدا سایز حافظه درخواستی ثبت میشه و سپس حافظه بعد آن به شما اختصاص داده میشه خود کامپایلر یه 4 بایت بیشتر میگیره تا سایز نگهداری کنه.حتی خودتون هم می تونید یه wrapper برای این قضیه بنویسید.



آیا حافظه ای به q اختصاص داده می شود؟
با تشکر از دوستان
q فقط اشاره گر هستش بعد از delete اشاره گر q نامعتبره البته اگر از smart pointer استفاده کنید چون reference count داره زمانیکه p را new می کنید rf=1 و وقتی p را به q نسبت می دید rf=2 و وقتی delete می کنید rf=1 میشه دیگه q نا معتبر نیست.

omidshaman
پنج شنبه 24 مرداد 1392, 19:46 عصر
اگر می خوای بهتر درک کنی چجوری new کار می کنه می تونی این لینک رو بخونی بعضی از کتاب های c هم درباره نحوه گرفتن حافظه از سیستم عامل توسط برنامه توضیح دادن
How do malloc() and free() work? (http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work)

Ninaxin
یک شنبه 27 مرداد 1392, 11:31 صبح
دوستان من یک کلاسی برای ماتریس نوشتم ولی کمی مشکل دارم.
در این کد :
vector <int *> v(2);
v[0] = new int [2];
v[1] = new int [2];
این دستورات یک آرایه ی 2*2 ایجاد می کنند.
حالا می خوام سطر اول شو حذف کنم.
آیا می شود از دستور زیر استفاده کنم؟
v[0]=v[1];
v.pop_back();
ممنون.

Ninaxin
یک شنبه 27 مرداد 1392, 11:40 صبح
البته اگر از smart pointer استفاده کنید چون reference count داره زمانیکه p را new می کنید rf=1 و وقتی p را به q نسبت می دید rf=2 و وقتی delete می کنید rf=1 میشه دیگه q نا معتبر نیست.
می شه درباره ی smart pointer کمی بیشتر توضیح دهید؟

omidshaman
یک شنبه 27 مرداد 1392, 12:24 عصر
این دستورات یک آرایه ی 2*2 ایجاد می کنند.
حالا می خوام سطر اول شو حذف کنم.
آیا می شود از دستور زیر استفاده کنم؟
v[0]=v[1];
v.pop_back();
ممنون.
نه اون راهش نیست اون کدی که نوشتی فقط عضو شماره ۱ رو pop_back می کنه حتی delete هم نمی کنه
پاک کردن درستش به این شکله .


C++‎‎‎‎‎‎98
typedef vector<int *>::size_type vectSize ;
vectSize SIZE =a.size();
for(vectSize i=0;i<SIZE;i++)
{
delete a[i];
}
a.clear();

C++‎‎‎‎‎‎11
for(auto i : a)
delete i;
a.clear();
از iterator یا algorithm ها هم میشه استفاده کرد.

omidshaman
یک شنبه 27 مرداد 1392, 12:49 عصر
می شه درباره ی smart pointer کمی بیشتر توضیح دهید؟
ساختار ساده ای دارن . یک کلاس که توی destructor اش delete انجام میشه
یک خوبی که دارن اینه که دیگه نیازی به delete کردن ندارن و خودکار پاک میشن
انواع متفاوتی هم دارن
یکیشون unique_ptr ه که اطلاعات یک پوینتر خاص رو ذخیره می کنه و هر وقت از scope خارج بشه اونو پاک می کنه یعنی شما دیگه نیازی به delete ندارین
مثلا برای برنامه شما میشه

vector<unique_ptr <int>> a(2);

a[0]=unique_ptr<int>(new int(7));
a[1]=unique_ptr<int>(new int(4));

Ninaxin
یک شنبه 27 مرداد 1392, 13:56 عصر
اگر می خوای بهتر درک کنی چجوری new کار می کنه می تونی این لینک رو بخونی بعضی از کتاب های c هم درباره نحوه گرفتن حافظه از سیستم عامل توسط برنامه توضیح دادن
How do malloc() and free() work? (http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work)
از جواب شما متشکرم. ولی من زبان سی رو بلد نیستم پس اگه ممکنه به زبان سی++ راهنمایی کنید.
خیلی متشکرم.

omidshaman
دوشنبه 28 مرداد 1392, 22:51 عصر
از جواب شما متشکرم. ولی من زبان سی رو بلد نیستم پس اگه ممکنه به زبان سی++ راهنمایی کنید.
خیلی متشکرم.
از نظر نحوه عملکرد malloc و free زیاد با new و delete فرق ندارن خوندن اون لینک فکر کنم برای درک این که چجوری new کار می کنه کافی باشه