目录
C语言分配和释放内存
分配
1.malloc函数
其函数原型为:
#include <stdlib.h>
void *malloc(size_t size);
其作用是在系统内存的动态存储区中分配一个长度为size字节的连续空间,并将此存储空间的起始地址作为函数值返回。
malloc函数返回值是指向void类型的,也就是不规定指向任何具体的类型。如果想将这个指针值赋值给其他类型的指针变量,应当进行显示转换(强制类型转换)。
分配的内存空间内容不确定,一般使用memset初始化。
如果内存缺乏足够大的空间进行分配,则malloc函数值为NULL。
2.calloc函数
其函数原型为:
void* calloc(unsigned int n,unsigned int size)
作用是分配n个长度为size字节的连续空间。返回值为该空间的首地址,如果分配不成功返回NULL。
calloc分配的内存初始化为0。
释放
在程序运行过程中,用户可以使用内存分配函数分配内存,这些内存因为是由用户自己申请分配的,所以在程序运行结束前,系统并不能自动收回该内存。为了避免内存的浪费,用户应该在使用完这些内存后主动把这些内存交还给系统。把申请的内存交还给系统的过程被称为释放内存。
free函数原型为:
#include <stdlib.h>
void free(void *ptr);
其作用是将指针变量ptr指向的存储空间释放,及交还给系统,系统可以另行分配其作用。对同一内存空间多次释放会出错。
需注意:因为系统可以另行分配其作用,所以不要再使用那个位置的内存,会出现不可预料的错误。
malloc和free配合使用:
int main()
{
int* p = (int*)malloc(sizeof(int));
if (p)
{
*p = 123;
printf("%p\n", p);
}
free(p);
int* p = NULL;
}
C++分配和释放内存
new运算符
new运算符用法:
new TYPE 【参数列表】 【初始化列表】
“【】”中的两个列表都是可选的,当省略前一个列表的时候,说明分配空间的new运算符只需要分配一个TYPE元素的内存空间;当省略了后面的列表时说明不使用参数对分配的内存进行初始化。
例:
int* p = new int(123);
float* p = new float(3.1415);
char* p = new char[5];
new和malloc的区别:
(1)new分配内存后返回的指针类型与分配时使用的数据类型相同。
(2)new分配内存时无需指定内存块的大小,编译器会根据类型信息自行计算。
(3)new内存分配失败不会返回NULL,而是抛出一个bac_alloc异常。
delete运算符
delete根据内存指针指向的地址释放内存,使用new分配的内存必须使用delete运算符释放,释放非数组内存delete用法如下:
delete 指针;
释放数组内存delete用法如下:
delete [ ]指针;
例:
int main()
{
int* p = new int(123);
printf("%p\n", *p);
delete p;
p = nullptr;
}
C++中定义的关键字nullptr代表空指针,防止发生指针误操作。