new、delete 灰太狼 2022-03-19 15:22 191阅读 0赞 ### 文章目录 ### * * 概念 * C与C++使用对比 * malloc、free和new、delete之间的区别 ## 概念 ## * new和delete是C++中的操作符 * new和delete是在自由存储区(可以理解为堆)上开辟空间,所以也需要手动释放 -------------------- ## C与C++使用对比 ## 1. 申请、释放 一个 int 空间 c中的写法 int* p =(int*)malloc(sizeof(int)); *p=10; if(p!=NULL) { free(p); p=NULL; } cpp中写法 int* p = new int; *p = 10; if(p !=NULL) { delete p; p=NULL; } int* p =new int(10);//将申请的空间初始化为10 1. 申请、释放 一个数组 c中的写法 int *p =(int*)malloc(sizeof(int)*10); for(int i=0; i<10; i++) { p[i]=i; } if(p !=NULL ) { free(p); p=NULL; } cpp中写法 int* p = new int[10] for(int i=0; i<10; i++) { p[i]=i; } if(p !=NULL ) { delete[]p; p=NULL; } -------------------- ## malloc、free和new、delete之间的区别 ## 1. malloc、free是stdlib里面的标准库函数;但是new、delete是C++中的操作符,效率高一点,底层调用了malloc/free。 2. malloc/free需要手动计算类型大小且返回值为void\*,new/delete可自己计算类型的大小对应类型的指针。 3. 在创建一个对象的时候,new和delete能够触发构造函数和析构函数,但是malloc和free不行。 举例:如果对象中有指针,指针初始化时候在堆上开辟了空间,最后需要在析构中释放,delete能够触发析构;但是用free,在堆上开辟的对象空间释放了,但是对象成员的指针指向的空间泄露了。 class Person { public: Person() //无参构造 { m_a =1; m_b =2; ptr = new int; //在堆上又开辟空间 } Person(int a, int b) //有参构造 { m_a =a; m_b =b; ptr = new int; //在堆上又开辟空间 } ~Person() { if(ptr!=NULL) { delete ptr; ptr=NULL; } } private: int m_a; int m_b; int * ptr; }; Person* p= new Person //触发无参构造 Person* p= new Person(10,20) //触发有参构造 delete p // 空间全部释放 free p // ptr指向的堆的空间泄露了
还没有评论,来说两句吧...