malloc、realloc、calloc和free几个函数的申明分别为:
void* malloc(unsigned size);
void* calloc(size_t numElements,size_t sizeof(Element));
void* realloc(void* ptr,unsigned newsize);
他们的返回值都是请求系统分配的地址,如果请求失败就返回NULL;
其中malloc用于申请一段新的地址,参数size为需要内存空间的大小;
calloc第一个参数为申请地址的单位元素长度,第二个为元素个数;
realloc是给一个已经分配了地址的指针重新分配空间,第一个参数为原有空间的地址,第二个为重新申请后的地址长度;
free调用形式为:free(void* ptr); 释放ptr所指向的一块内存空间。
C++通过new和delete动态管理内存:
其中:new、delete动态管理对象;new[]、delete[]动态管理对象数组。
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 delete(void* ptr);
void* operator new[](size_t size);
void operator delete[](void* ptr);
这几个均为函数,并非重载;
他们只负责分配空间/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象;
实际上operator new和operator delete只是malloc、free的一层封装。
其中new干两件事:
1.调用operator new分配空间。
2.调用构造函数初始化对象。
delete也干两件事:
1.调用析构函数清理对象。
2.调用operator delete释放空间。
定位new表达式
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
两种方式:new (place_address) type;
new (place_address) type(initializer-list);
place_address必须是一个指针,initializer-list是类型的初始化列表。