程序区域内存划分
C/C++程序内存区域划分非常相似。
C语言动态内存分配:
malloc、calloc、realloc都是C语言动态开辟内存的常用函数
其中 malloc 开辟一块空间,不会对这块空间进行初始化,而calloc会初始化这块空间为0,realloc则在需要扩充空间时使用。
operator new和operator delete:
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
而operator new 和 operator delete 底层依然是调用malloc和free实现的。
new和delete:
对于内置类型
new和malloc,delete和free基本类似,不同的地方是:
new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。
除此之外new可以在申请空间后赋值。
int* p1 = new int;
int* p2 = new int(2);//赋值
int* p3 = new int[3];
int* p4 = new int[3]{1,2,3};//赋值
对于自定义类型
- new
1、先调用operator new申请一块空间
2、调用构造函数初始化 - delete
1、先调用析构函数完成对象内空间释放
2、调用operator delete删除对象 - new[]
1、先调用operator new[] 实际调用operator new完成N次对象空间的申请
2、调用N次构造函数初始化 - delete[]
1、先调用N次析构函数完成对象内空间释放,完成对象空间内资源的释放
2、调用operator delete[]实际上调用operator delete删除N个对象
定位new表达式:
格式:new (指针) type(初始化列表)
type指对象的类型
定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。
int main()
{
A* p1 = (A*)malloc(sizeof(A));
new(p1)A(1);
// 注意:如果A类的构造函数有参数时,此处需要传参
p1->~A();
free(p1);
}
new、delete和malloc、free的区别:
1、new能初始化,malloc不行
2、new/delete是操作符,而malloc/free是函数
3、new申请空间不需要计算大小,malloc需要手动计算
4、new后跟空间类型,不需要强制类型转换,malloc需要
5、new失败后需要捕获异常,malloc失败返回NULL
6、new/delete会调用构造函数/析构函数完成初始化/对象空间资源清理,而malloc不会。