动态内存管理函数
free( )函数
void free(void* ptr);
- 释放ptr指针指向的一块动态开辟的空间。
- 通常释放完空间,要将ptr置空,防止出现野指针
malloc( )函数
void* malloc (size_t size);
- 开辟一个大小为size字节大小的空间。
- 若开辟失败,则返回一个NULL指针
- 若开辟成功,则返回这块空间的指针,因为该指针为void*类型,所以具体使用时可以进行强转。
calloc( )函数
void* calloc (size_t num, size_t size);
- 该函数功能是为num个大小为size的元素开辟一块空间,并初始化为0。
- 返回值:若开辟失败,则返回一个NULL指针。
- 若开辟成功,则返回这块空间的指针,因为该指针为void*类型,所以具体使用时可以进行强转。
raelloc( ) 函数
void* realloc (void* ptr, size_t size);
- 调整动态开辟空间的大小
- ptr 是要调整的空间的指针
- size 为调整后的大小
- 使用时的两种情况:
- 原有空间之后本身就有足够大的空间,此时只需要在原有内存之后直接追加空间,原来空间的数据不发生变化。
- 原有空间之后没有足够大的空间,此时要在堆上重新找一个适合大小的连续空间进行使用,此情况下函数返回的是一个新的内存地址。
- 要避免下面这种情况, 当 realloc 分配失败后,p原先所指向的内存地址将会丢失。
p = realloc(p, 2048)
正确做法如下
int* p = (int*)malloc(100);
int* temp = NULL;
temp = (int*)realloc(p, 50);
if(temp)
{
p = temp;
}
或
int* p = (int*)malloc(100);
int* temp = p;
p = (int*)realloc(p, 50);
if(p)
{
temp = NULL;
}
常见的动态内存错误
- 对NULL指针的解引用
- 对动态开辟空间越界访问
- 对非动态开辟的内存使用了free函数释放
- 对同一块动态内存多次释放
- 使用free函数释放一块动态开辟内存的一部分
- 忘记使用free函数释放,造成内存泄漏。