内存管理

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即申请空间,也可以进行初始化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值