malloc realloc calloc
-
malloc : void* malloc (size_t size);
用来申请size字节大小的堆内存 -
relloc : void* realloc (void* ptr, size_t size);
为ptr所指向的内存重新分配一段size大小的空间, 存在原地扩容和非原地扩容, 缩小空间指针指向不变
原地扩容 : 与要增加的空间在一个数量级上时,在原有空间上增加空间,指针指向不变
非原地扩容 : 与要增加的空间不在一个数量级上, 释放原有空间, 重新分配一段内存, 指针指向改变 -
calloc : void* calloc (size_t num, size_t size);
在堆上分配size个大小的空间, 并赋值为num
void test()
{
int* pi = (int*)malloc(sizeof(int));
int* pi2 = (int*)realloc(pi, sizeof(int)* 4); //原地扩容
int* pi3 = (int*)realloc(pi2, sizeof(int)* 1000); //非原地扩容:会释放原有空间
int* pi4 = (int*)realloc(pi3, sizeof(int)); //减小容量
//int* pi5 = (int*)realloc(NULL, sizeof(int)); //相当于malloc
//释放空间 : A 正常释放 B 编译错误 C 崩溃
//realloc: 不需要显示释放传入ralloc的指针参数所指向的空间
//free(pi);
//free(pi2);
//free(pi3);
free(pi4);
//free(pi5);
//calloc: 申请空间 + 空间的零初始化
int* pi5 = (int*)calloc(4, sizeof(int));
}
new delete
-
malloc / free
自定义/内置类型 : malloc只申请空间,不会进行初始化, free只做释放空间 -
new / delete
内置类型 :
new : new(申请空间, 也可以初始化), new 类型(初始值)
delete : 释放空间, delete 类型
new [] : 申请连续的空间, 不可以初始化
delete []: 释放连续的空间自定义类型 :
new : 申请空间 + 调用构造函数(可以是默认构造函数, 也可以是带参构造)
delete : 调用析构 + 空间释放
new [] : 申请连续空间 + 调用默认构造(必须要有默认构造)
delete [] : 调用析构 + 释放空间 -
new的定位表达式
显示调用构造函数, 在已经申请好的空间上进行初始化
new (空间指针) 类型(参数列表)
void test()
{
A* pa = (A*)malloc(sizeof(A));
//显式调用构造函数: new定位表达式: 在已经申请好的空间上进行初始化
// new (空间指针) 类型(参数列表)
new (pa)A(1, 2, 3); //带参构造
A* pa2 = (A*)malloc(sizeof(A));
new (pa2) A; //无参构造
}
operator new / opeator delete
- operator new : void* operator new(size_t n)
全局函数, 不是new的运算符重载函数, 功能类似于malloc, 实质为malloc + 异常机制
void test()
{
void* ptr1 = operator new(10);
//void* ptr = new 10;
int* p1 = (int*) malloc(sizeof(int));
int* p2 = (int*) operator new(sizeof(int));
}
- operator delete
封装了free
//operator delete : 封装free
void test()
{
int* pi = (int*) operator new(sizeof(int));
operator delete(pi);
}
new和delete的底层实现
new : 调用operator new申请空间 + 调用构造
delete : 调用析构 + 调用operator delete释放空间
operator new : malloc + 异常
operator delete : free
new[] : operator new[] —> operator new + 默认构造
delete[] : 调用析构 + operator delete —> operator delete
malloc和new的区别
- malloc申请失败返回空指针, new申请失败抛异常(bad_alloc)
- malloc是函数, new是关键字
- malloc只申请空间, new即申请空间,也可以进行初始化