A *a = new A[100];
我们不能创建的同时赋初值:
A *a = new A[100](1);
创建了当然就要销毁了:
delete [] a;
当我们使用delete去delete this时,要注意哪些问题?
1、必须使用new分配的this对象,而不是用new[]。
2、包含delete this的成员函数必须是在this对象上最后调用的成员函数。
3、在delete this后,该成员函数的剩余部分一定不要接触this对象的任何部分,包括调用任何其他成员函数或者接触任何数据成员。
4、在delete this后没有其他部分代码并且不能检查this指针本身。
5、确保没有其他人对该对象进行删除。
delete this还会用在线程的消亡上,当线程由于某种原因不能正常结束的时候,会选择该方式结束,释放一些资源。
malloc()/free()函数的使用:
先来看一下malloc:
[cpp]
void* malloc(size_t size);
int *p = (int*)malloc(sizeof(int) * length);
我们用malloc申请了一块长度为length的整形类型的内存, 因为malloc()返回的类型是void* 所以在调用函数的时候要进行类型转换。
malloc函数本身并不识别要申请的内存是什么类型,只关心内存的总字节数。这里我们就可以用sizeof。
free函数原型:
[cpp]
void free(void* memblock);
可以看出,free没有malloc复杂,因为指针p的类型以及它所指向的内存的容量事先都知道,语句free(p)能正确地释放内存。如果p是NULL指针,那么free()函数对p无论操作多少次都不会出问题,如果不是NULL指针,那么free函数对p连续操作两次就会导致程序运行错误。
malloc与free是C/C++语言的标准库函数,new与delete是C++的运算符,它们都可以用于申请动态内存和释放内存。
对于非内存数据类型的对象而言,光是用malloc/free无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,兑现公仔消亡前也要自动执行析构函数。由于malloc和free是库函数不是运算符,不在编译器控制权之内,不嫩巩固把执行构造函数和析构函数的任务强加于malloc和free;
C++需要一个能完成动态内存分配和初始化工作的运算符new,以及能完成清理与释放内存工作的运算符delete。
在这里,如果我们用free释放new创建的动态对象,那么对象因无法执行析构函数而可能导致程序出错。如果用delete释放malloc申请的动态内存,理论上可行,但是可读性差。