栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言之动态内存管理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言之动态内存管理

C语言之动态内存管理
    • 1、动态内存主要涉及的函数
    • 2、原则
    • 3、内存错误案例
    • 4、野指针

1、动态内存主要涉及的函数
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
2、原则

谁申请谁释放

3、内存错误案例

在这个案例中,出现了严重的地址泄漏。因为,P通过传参过去,函数里面的P已经和主函数的不是一个*P,所以导致。已经把动态创建的内存的首地址,丢失了。导致已经无法释放内存。

void func(int *p,int n)
{
	*p = malloc(n);
	if(p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(p,num);
	free(p);
	return 0;
}

解决方法一:
使用二级指针,讲主函数的p真正的传参过去

void func(int **p,int n)
{
	*p = malloc(n);
	if(*p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(&p,num);
	free(p);
	return 0;
}

解决方法二:
通过返回值,讲函数的p指针返回

int * func(int *p,int n)
{
	*p = malloc(n);
	if(*p == NULL)
		exit(1);
	return p;
}
int main
{
	int num = 100;
	int *p = NULL;
	p = func(p,num);
	free(p);
	return 0;
}
4、野指针

在函数已经把p这个指针通过free进行了释放,但是你又给p进行了赋值操作。这个时候,编译器会随机给p发配了一个地址,这个地址已经不是之前的地址了。就会造成野指针现象。

void func(int *p,int n)
{
	*p = malloc(n);
	if(p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(p,num);
	free(p);
	p = 123;//注意这一行
	return 0;
}

解决方法:
在创建或者释放指针的时候,都多加上一句指针指向NULL,可以防止出现危险的野指针

void func(int *p,int n)
{
	*p = malloc(n);
	if(p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(p,num);
	free(p);
	p = NULL;//将指针指向空
	p = 123;//注意这一行
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号