new和delete,malloc和free
new/delete,new[]/delete[]基本格式
int* p1 = new int;
int* p2 = new int(3); //初始化为3
int* p3 = new int[3]; //动态建立数组p3[3];
delete p1;
delete p2;
delete p3[];
在C++中,把int,char,等内置类型的变量也看作对象,它们也是存在构造函数和析构函数的,只是通常对它们,系统调用默认的构造函数来初始化以及默认的析构。所以new int,new int(3)看起来和普通的定义好像没有什么区别。但对于自定义对象,此种方式在创建对象的同时,还会将对象初始化好;于是new/delete,new[]/delete[]方式管理内存相对于malloc/free的方式管理的优势就体现出来了,因为它们能保证对象一被创建出来便被初始化,出了作用域便被自动清理。
其实new表达式并不是直接开辟内存出来,而是通过调用operrator new 来获得内存,而operator new获得的内存实质上还是用malloc开辟出来的。这便证实了前面所述的:开空间出来还是要malloc
delete表达式也不是直接去释放内存
int* p1 = new int[10];
delete[]p1;
delete[]实际做的是:
- 依次调用p1指向对象数组中的每个对象的析构函数,共10次
- 调用operator delete[]函数,它再调用operator delete函数
- 底层再用operator free去执行operator delete表达式,依次释放内存
小结 operator new/ operator delete:
- operator new/operator delete operator new[]/operator delete[] 和 malloc/free用法一样
- 他们只负责分配空间/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象。
- 实际operator new和operator delete只是malloc和free的一层封装