PDA

View Full Version : مبتدی: برتری new,delete نسبت به malloc,free ؟



smemamian
دوشنبه 27 آذر 1391, 22:55 عصر
سلام دوستان

برتری new,delete نسبت به malloc,free چیه ؟

مصطفی ساتکی
سه شنبه 28 آذر 1391, 15: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, 18: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, 20: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, 20:43 عصر
تو اکثر فروم ها قاعده بدین صورتیکه سوالات مختلف در تاپیک های مختلف پرسیده میشه علتش هم دسترسی راحت به مطالب و کلاسیفای کردن آنهاست.
و اما جواب زمانی که شما از new[n] استفاده می کنید یعنی اینکه شما از scalar استفاده کردید بایستی delete [] استفاده کنید و کلیه مخرب های مربوط به آبجکت ها هم فراخوانی مبشه .نوشتن مقدار در delete ضرورتی نداره ننویسید بهتر هم هست چون ممکن باعث اشتباه بشه کامپایلر خودش تشخیص می ده و زمانی new استفاده بشه از delete استفاده میشه .
در شرایطی که شما از new[n] استفاده کنید و برای آزاد سازی به اشتباه از delete استفاده کنید بجای delete[] در این صورت آبجکت اول مخربش فراخوانی میشه و حافظه آن بر می گرده و بقیه آبجکت های موجود در آرایه میشه memory leakage