内存分配和管理
malloc、calloc、realloc、alloca
1.malloc:申请指定字节数的内存。申请到的内存中的初始值不确定。
2.calloc: 为指定长度的对象,分配能容纳其指定个数的内存。申请到的内存每一位(bit)都初始化为0。
3.realloc:更改以前分配的内存长度(增加或减小),当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值不确定。
4.alloca:在栈上申请内存。程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca不具有可移植性,而且没有在传统堆栈的机器上很难实现。alloca不宜使用在必须广泛移植的程序中。c99中支持变长数组(VLA),可以用来替代alloca。
malloc free
用于分配、释放内存malloc、free使用
申请内存,确认是否申请成功
char *str = (char*)malloc(100);
assert(str != nullptr);
释放内存后指针置空
free(p);
p = nullptr;
new delete
1.new/new[]:完成两件事,先底层调用malloc分配了内存,然后调用构造函数(创建对象)。
2.delete/delete[]:也完成两件事,先调用析构函数(清理资源),然后底层调用free释放空间。
3.new在申请内存时会自动计算所需字节数,而malloc则需要我们自己输入申请内存空间的字节数。
new delete使用
int main(){
T* t = new T(); //先内存分配,再构造函数
delete t; //先析构函数,再内存释放
return 0;
}
delete this合法吗?
合法,但:
1.必须保证this对象是通过new (不是new[]、不是placement new、不是栈上、不是全局、不是其他对象成员)分配的。
2.必须保证调用delete this的成员函数是最后一个调用this的成员函数。
3.必须保证成员函数的delete this后面没有调用this了。
4.必须保证delete this后面没有人使用了。