动态内存分配
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[]释放内存空间,调用每个元素的析构函数