C和C++动态内存分配

本文详细介绍了C/C++中的动态内存分配函数如malloc,calloc,realloc,new和delete,以及它们在内存操作和对象生命周期管理上的差异,包括初始化、扩展、释放和构造/析构函数的调用。
摘要由CSDN通过智能技术生成

动态内存分配

C语言的动态内存分配和操作

malloc

//void* malloc(size_t size);C语言 size_t是unsigned int
int* p = (int*)malloc(elementNum * sizeof(int));//未初始化的脏数据-842150451 0xFFFF FFFF CDCD CDCD

calloc

//void* calloc(size_t cnt, size_t size);
int* p = (int*)malloc(elementNum, sizeof(int));//和malloc区分是这部分初始化内存清零

realloc

//void* realloc(void* _Block, size_t _Size);
//扩充时判断原来的地址能否向后扩,可以则扩,否则则从头到尾从新分配一块连续内存然后拷贝数据进去
p = (int*)reallco(p, elementNum);//新扩的未初始化内存为-842150451 0xFFFF FFFF CDCD CDCD堆上未初始化的标志

free

//void free(void* _Block);
free(p);

memcpy

void* memcpy(void* Dst, const void* Src, size_t Size);//复制Src的Size个元素过去给Dst

memset

void* memset(void* Dst, int val, size_t Size);//对Dst的Size个元素设置为val
memset(p, 0x1234, 5 * sizeof(int));//最后0x1234只会读取1B也就是只会读取34来填充4B成为34343434的十六进制数据
//当我们读取p[0] p[1] p[2] 时如下图所示数据输出的原因
//因此通常memset只会被用来初始化数组为0或0xff/-1
//原理即memset(p, 11, 3 * sizeof(int));中的十进制11会转为16进制B来初始化为0B0B0B0B = (10进制)185'273'099来初始化数组

在这里插入图片描述

C++的动态内存分配

C++的动态内存分配的底层实现基于C语言的动态分配实现的

new

//数据类型* 指针变量名称 = new 数据类型;
//数据类型* 指针变量名称 = new 数据类型[数量];

delete

//delete 指针;
//delete[] 指针;
C和C++动态分配操作的本质区别
malloc和new

对于普通数据类型无区别

对于类来说,malloc仅仅分配内存。new除了分配内存外还会调用构造函数

new是运算符,可以重载

free和delete

对于普通数据类型无区别

对于类来说,free仅仅释放内存。delete除了释放内存外还会调用析构函数

delete是运算符,可以重载

delete和delete[]

对于普通数据类型无区别

delete释放内存空间调用第一个元素的析构函数,delete[]释放内存空间,调用每个元素的析构函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值