C++学习笔记4_new和delete

1. 默认的new和delete操作符
new和delete是和c里面的mlloc和free是一样的,在堆中创建空间。堆中创建的,都要自己释放。
C中
void test()
{
int *p=(int *)malloc(sizeof(int));
if(p!=NULL)
{
free(p);//free完p后,p不会自动变为NULL
//malloc出来的空间,可以使用delete p。
p=NULL;
}
int *array_p=(int *)malloc(sizeof(int)*10);
for(int i=0;i<10;i++)
{
array_p[i]=1;
}
//...
}
C++中
void test2()
{
int *p=new int;
if(p!=NULL)
{
delete p;
//也可以使用free(p)
p=NULL;
}
int *array = new int[10];
//new int(10);开辟一个int,赋值为10
if(array!=NULL)
{
delete[] array;//最好写成这样,防止某些编译器不支持
}
}
//malloc 和free是函数,标准库,stdlib.h standwardLibrary
//new和delete是C++的操作符,不同free函数需要压栈(类似在栈中开辟内存干活)和出栈(类似释放栈中的内存)。
注意:
使用malloc开辟内存,如果sizeof(A),类型A是有有参构造函数的话,是不会执行的,所以A只能写一个initial方法来初始化。
使用new,例如使用A *a = new a(10,10);那么是可以执行构造函数的。
使用free并不能触发对象的析构函数,所以要写一个dispose之类的函数来释放a中,指针指向堆的内存。
使用delete能触发析构函数。

2. 重写new和delete操作符(一般很少这样玩)
class A
{
A(int a)
{

}
//重载new操作符,依然会触发A的构造函数。调用new A(10)
void* operator new(size_t size)//size_t实际上按sizeof(int)大小取的
{
return malloc(size);
}
//重载delete操作符,依然会触发A的析构函数。调用delete a
void operator delete(void *p)
{
if(p!=NULL){
free(p);
}
}

void* operator new[](size_t size)//size_t实际上按sizeof(int)大小取的
{
return malloc(size);
}

void operator delete[](void *p)
{
if(p!=NULL){
free(p);
}
}
}
int mian
{
A*ap;
ap->operator new(sizeof(A));
}

3.new[]和delete[]也是可以重载的

猜你喜欢

转载自www.cnblogs.com/pylblog/p/9820766.html