在C语言中,申请回收堆内存使用的是malloc和free。见代码
#include<iostream> using namespace std; #define SIZE 10 int main(int argc, char *argv[]) { int *p_int = (int *)malloc(sizeof(int)*SIZE); if (NULL == p_int) exit(1); for (int i = 0; i < SIZE; i++) { p_int[i] = i; } free(p_int); return 0; }
C++针对申请回收堆内存引入了新的方法,即new和delete,见代码
#include<iostream> using namespace std; #define SIZE 10 int main(int argc, char *argv[]) { int *p_int = new int[SIZE]; for (int i = 0; i < SIZE; ++i) p_int[i] = i; delete[]p_int; return 0; }
C 和 C++差异点
①C++开辟堆内存不需要像C一样强制类型转换
②一般new开辟的空间不需要使用if(NULL==p)判空,而是和异常机制相结合
③C++允许在申请空间的时候同时初始化,C必须先申请再初始化。
#include<iostream> using namespace std; int main(int argc, char *argv[]) { int *p_int = (int *)malloc(sizeof(int)); *p_int = 10; free(p_int); int *q_int = new int(10); delete q_int; return 0; }
④对于普通变量的开辟释放内存差异不是很大。但是对于类而言,malloc仅仅只是申请内存。而new在申请内存的时候调用了构造函数,还可以初始化。delete的时候调用析构函数再释放空间
delete[]的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。
C++,由堆区创建对象数组,只能调用缺省的构造函数,不能调用其他任何构造函数。如果没有缺省的构造函数,则不能创建对象数组。
new三种形式
扫描二维码关注公众号,回复:
2863250 查看本文章
new operator、operator new、placement new
分割线上面就是new operator,这是我们最常见的new使用方式。实际上new operator分成了2步
①调用operator new开辟空间,而开辟空间还是调用的malloc。这一块跟代码跟不出来,我找到了对应的汇编形似
operator new: 00409280 push ebp 00409281 mov ebp,esp 00409283 push ecx 00409284 push1 00409286 mov eax,dword ptr [cb] 00409289 push eax 0040928A cal1 _nh malloc(00409c30) 0040928F add esp,8 00409292 mov dword ptr [res],eax 00409295 mov eax,dword ptr [res] 00409298 mov esp,ebp 0040929A pop ebp 0040929B ret
②调用相应构造函数构造对象
一旦使用new operator,①②都要开始做,缺一不可。但是我们可以通过重载operator new影响operator new开辟空间的过程。