引言:
动态内存管理:需要根据具体情况来设定需要的内存大小,同时可能需要大于1Mbyte的连续空间。此时我们无法使用静态数组。原因是因为静态数据的开辟是在栈空间,其次栈空间的大小在连续分配时不能超过1Mbyte,因此引入了动态内存管理。
C语言
C语言中动态内存管理的有四个函数:malloc,calloc,realloc,free,都需要引用stdlib.h头文件
动态内存管理所在的区域:堆空间
手动开辟内存
malloc
向堆区申请一块指定大小的连续存储空间。
函数原型:void *malloc(size_t size);
参数:要申请的字节数
返回值:指向这段内存的指针
int* p = (int*)malloc(5 * sizeof(int));
calloc
分配连续的内存空间并将空间中的值赋值为0
函数原型:void *calloc(size_t nmemb, size_t size);
参数: nmemb 开辟空间的块数
size 开辟的每块空间的大小 (开辟了一个数组)
返回值:空间的首字节地址
int* p = (int*)calloc(5, sizeof(int));
realloc
重新分配内存区块(扩充内存区块),必须在malloc或者calloc之后使用
函数原型:void *realloc(void *ptr, size_t size);
参数: ptr 指向的内存区块的指针
size 设置的新内存空间大小
ptr非空 size非空 重新设定内存大小
ptr为空 size非空 等同于malloc
ptr非空 size空 等同于free
返回值:新的空间的地址
int* p = (int*)malloc(5 * sizeof(int));
int* p1 = (int*)realloc(p, 7 * sizeof(int));
手动释放内存
free
用来释放从malloc,calloc,realloc成功获取的动态内存分配的空间,只有开辟内存后才可以释放内存
函数原型:void free(void *ptr);
参数:ptr 指向堆空间的指针
free完后一般需要将指针置空,防止多次释放
C++ ----- new/delete
概念
就是内存空间由程序员手动的开辟和释放。
手动开辟内存
开辟单个内存
数据类型* 指针变量 = new 数据类型;
int * p = new int(10);//在 自由存储区 中开辟一个大小是int的空间,并将10存进去,将该空间变量首地址返回
开辟连续的多个内存
数据类型* 指针变量 = new 数据类型[长度];
int* p = new int[n](10);
int* p1 = new int[n]{1,2,3,4,5,6,7};
释放内存
释放单个内存
delete 指针变量;
释放连续的多个内存
delete[] 指针变量
new,malloc区别
1 new/delete是C++中的运算符。malloc/free是C语言中的库函数。
2 malloc申请内存空间时,手动计算所需大小。new只需要类型名,自动计算大小。
3 malloc申请的内存空间不会初始化。new可以初始化。
4 malloc的返回值为void*,接收时必须强转。new不需要。
5 malloc申请空间失败时,返回的是NULL,使用时必须判空。new申请空间失败时抛出异常,。
6 new/delete会调用构造、析构函数。malloc/free不会调用。
标签:free,malloc,int,C++,C语言,内存,new,size From: https://blog.csdn.net/you_52/article/details/141143690