目录
动态内存管理
概念
malloc的全称是memory allocation,也就是 是动态内存分配函数
首先来看函数原型
函数原型为 void *malloc(unsigned int size) ;其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
返回类型为 void *,该类型相当于一个通用型指针,最好在将返回的指针强制转换为需要的类型,这样可以提高可读性。
然而,把void 的指针赋给任意类型的指针完全不用考虑类型匹配问题。
如果malloc()分配内存失败,将返回一个空指针。
动态内存开辟常见错误
1,对NULL指针的解引用操作
int main()
{
int* p = (int*)malloc(100000000);
对malloc()函数的返回值做判空处理
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
return 0;
}
2,对动态开辟的空间做越界访问
int main()
{
int* p = (int*)malloc(10 * sizeof(int));
int* p = (int*)malloc(100000000000);
if (p == NULL)
{
return 1;
}
int i = 0;
for (i = 0; i < 40; i++)
{
*(p + 1) = i;
}
free(p);
p = NULL;
return 0;
}
3,使用free释放非动态开辟的空间
int main()
{
int arr[10] = { 0 };
int* p = arr;
free(p);
p = NULL;
return 0;
}
这种静态开辟的空间,不能用free()释放
4,使用free释放动态开辟内存的一部分
int main()
{
int* p = malloc(10 * sizeof(int));
if (p == NULL)
{
return 1;
}
int i = 0;
for (i = 0; i < 5; i++)
{
*p++ = i;
}
free(p);
p = NULL;
return 0;
}
不能中途释放;p指针在移动了之后,不能记住起始地址有内存泄露的风险
5,对同一块动态内存开辟的空间,多次释放
int main()
{
int* p = (int*)malloc(100);
使用;
释放;
free(p);
p = NULL;//添加为空指针之后,释放就不会出问题了
free(p);
return 0;
}