C语言动态内存管理
C语言使用malloc/calloc/realloc/free 进行动态内存管理
1.malloc/calloc/realloc的区别:
三个函数的的声明是:
void *malloc(unsigned size);
void *calloc(size_t numEles,size_t sizeofEle);
void *realloc(void *ptr,unsigned newsize);
malloc用于申请一段新的地址,不初始化内容,一个参数size为申请内存空间的长度;
colloc用于申请一段新的地址,并初始化为零,第一个参数表示申请地址的单位元素长度,第二个表示元素个数;
realloc是给一个已经分配了地址的指针重新分配空间,第一个参数表示原有的地址,第二个表示重新申请的地址长度。
三者均在stdlib.h库函数中,都是请求系统分配空间,若申请失败就返回NULL。
free的调用形式为free(void *ptr):释放ptr所指向的一块内存空间。
void Test()
{
int *p1=(int*)malloc(sizeof(int)*4);
int *p2=(int*)calloc(4,sizeof(int));
int *p3=(int*)realloc(p2,sizeof(int)*6);
free(p1);
free(p3);//此处不需释p2,因为p3已经指向p2的位置。
}
C++动态内存管理
C++通过new和delete动态管理内存
new/delete动态管理对象
new[]/delete[]动态管理数组对象
注意malloc/free、new/delete、new[]/delete[]一定要匹配使用!否则可能出现内存泄漏甚至崩溃的问题。
内存管理
全局变量,静态全局变量,局部静态变量,局部变量之间的区别是什么?
局部变量在整个工程文件中都有效,静态全局变量只在定义它的文件中有效,局部静态变量只在定义它的函数中有效,并且内存只分配一次内存函数返回后改变量不会改变,这三个变量都位于静态存储区;而局部变量在定义它的函数内有效,函数返回后失效,变量放在内存的栈区。
1、栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2,、堆用于程序运行时动态内存分配,堆是可以向上增长的。
3、数据段—存储全局数据和静态数据。
4、代码段—可执行的代码/只读代码。
malloc/free和new/delete的区别和联系:
1、他们都是动态管理内存的入口,
2、malloc/free是C/C++标准库的函数,new/delete是C++操作符,
3、malloc/free只是动态分配内存/释放内存,而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理,
4、malloc/free需要手动计算类型大小且返回值是void*,new/delete可自己计算类型大小,返回对应类型的指针。
C++的其他内存管理接口
void* operator new(size_t size);
void operator deleyte(size_t size);
void* operator new[](size_t size);
void operator delete[](size_t size);
总结:operator new/operator delete operator new[]/operator delete[]和malloc/free用法一样,他们只是负责分配空间/释放空间,不会调用对象的构造函数/析构函数来初始化/清理对象,实际operator new和operator delete只是malloc/free的一层封装。
new做了两件事:
1、调用operator new分配空间。
2、调用构造函数初始化对象。
delete做了两件事:
1、调用析构函数清理对象。
2、调用operator delete释放空间。
new[N]
1,、调用operator new分配空间。
2、调用N次构造函数分别初始化每个对象。
delete[]
1、调用N此析构函数清理对象。
2、调用operator delete释放空间。
深度剖析new/delete&new[]/delete[]