View Full Version : مبتدی: برتری new,delete نسبت به malloc,free ؟
smemamian
دوشنبه 27 آذر 1391, 23:55 عصر
سلام دوستان
برتری new,delete نسبت به malloc,free چیه ؟
مصطفی ساتکی
سه شنبه 28 آذر 1391, 16:23 عصر
- روشی که در زبان C از حافظه دینامیک فضا اشغال میشه malloc هستش بدون مقدار اولیه و calloc همانند malloc ولی فضای مورد نظر را با صفر پر می کنه در این حالت type cast بایستی توسط خود کابر صورت بگیره و free هم فضای موردنظر را آزاد می کنه .
- روشی که در زبان C++ از حافظه دینامیک فضا اشغال میشه free هستش با این تفاوت نسبت به malloc که اگر نوع داده ای object باشه constructor مربوط به آن obejct فراخوانی میشه و type cast به صورت خودکار صورت می گیره و delete هم برای آزاد کردن فضای اشغال شده با new هستش.
- فضایی که توسط malloc اشغال شده با realloc می تونید فضای مورد نظر را تغییر انداره بدید.
- فضایی رو با new اشغال کنید و با free آزادش کنید حتماً بایستی از delete استفاده کنید.
-اگر قصد داشته باشید که new حافظه گرفته شده را همانند calloc با صفر پرکنه بایستی بدین صورت استفادش کنید
a = new unsigned int[5]();
smemamian
سه شنبه 28 آذر 1391, 19:34 عصر
گاهی در بعضی برنامه ها به دو صورت از delete استفاده میشه :
delete [size]ptr;
delete ptr;
تفاوت در چی هست ؟
فکر کنم مربوط به تعریف مخرب کننده ها باشه !
مثلا در برنامه زیر :
#include <cstdlib>
#include <iostream>
using namespace std;
class myclass {
int i , j ;
public :
void set (int a , int b) {i = a ; j = b ;}
int get() {return i*j ;}
};
int main(int argc, char *argv[])
{
myclass *p ;
p = new myclass[10];
for (int i=0 ; i < 10 ; i++)
p[i].set(i,i);
for (int i=0 ; i < 10 ; i++)
cout << p[i].get() << " " ;
delete p ;
system("PAUSE");
return EXIT_SUCCESS;
}
omidshaman
سه شنبه 28 آذر 1391, 21:42 عصر
برای پاک کردن ارایه ها باید از delete[] استفاده کرد
تو این برنامه شما هم درستش اینه
delete [] p ;
البته یک نکته هم این که توی استاندارد های جدید C++11 دو تا پوینتر جدید هم داریم به اسم share_ptr و unique_ptr که دیگه نیازی به فراخوانی delete ندارن و وقتی از scope اشون خارج بشن بصورت خودکار پاک میشن
لیستی از تفاوت های new و mallocهم توی لینک زیر هست می تونی نگاه کنی
http://wiki.answers.com/Q/What_is_the_difference_between_malloc_and_new_othe r_than_syntax
مصطفی ساتکی
سه شنبه 28 آذر 1391, 21:43 عصر
تو اکثر فروم ها قاعده بدین صورتیکه سوالات مختلف در تاپیک های مختلف پرسیده میشه علتش هم دسترسی راحت به مطالب و کلاسیفای کردن آنهاست.
و اما جواب زمانی که شما از new[n] استفاده می کنید یعنی اینکه شما از scalar استفاده کردید بایستی delete [] استفاده کنید و کلیه مخرب های مربوط به آبجکت ها هم فراخوانی مبشه .نوشتن مقدار در delete ضرورتی نداره ننویسید بهتر هم هست چون ممکن باعث اشتباه بشه کامپایلر خودش تشخیص می ده و زمانی new استفاده بشه از delete استفاده میشه .
در شرایطی که شما از new[n] استفاده کنید و برای آزاد سازی به اشتباه از delete استفاده کنید بجای delete[] در این صورت آبجکت اول مخربش فراخوانی میشه و حافظه آن بر می گرده و بقیه آبجکت های موجود در آرایه میشه memory leakage
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.