概念
- new和delete是C++中的操作符
- new和delete是在自由存储区(可以理解为堆)上开辟空间,所以也需要手动释放
C与C++使用对比
- 申请、释放 一个 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
- 申请、释放 一个数组
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之间的区别
- malloc、free是stdlib里面的标准库函数;但是new、delete是C++中的操作符,效率高一点,底层调用了malloc/free。
- malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型的大小对应类型的指针。
- 在创建一个对象的时候,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指向的堆的空间泄露了