其他
浅谈C语言程序内存泄漏
点击左上方蓝色“混说Linux”,选择“设为星标”
1
struct student
{
char *name; //这里只是分配了4个字节,没有指向一个合法的地址,内部是一些乱码
int score;
}stu, *pstu;
int main()
{
strcpy(stu.name, "code"); //所以这里会出错,解决方法就是为name指针malloc一块空间
stu.score = 99;
return 0;
}
另一种错误:
int main()
{
pstu = (struct student *)malloc(sizeof(struct student)); //这里还是没分配name内存,只是以为分了而已。
strcpy(pstu->name, "code");
pstu->score = 99;
free(pstu);
return 0;
}
int main()
{
pstu = (struct student *)malloc(sizeof(struct student *)); //这里写错了 sizeof(struct student),导致内存不足
strcpy(pstu->name, "code");
pstu->score = 99;
free(pstu);
return 0;
}
这种错误经常是由于操作数组或指针时出现“多 1”或“少 1”。比如:
int a[10] = {0};
for (i=0; i<=10; i++) //这里就越界了,多了一个
{
a[i] = i;
}
所以, for 循环的循环变量一定要使用半开半闭的区间,而且如果不是特殊情况,循环变量尽量从 0 开始。
一般是malloc或者new操作符分配的内存,若用完之后没有及时free或者delete,这块内存就没法释放,知道程序结束。
(void *)malloc(int size) //函数原型
/* 具体使用 */
char *p = (char *)malloc(100); //需要强制转换类型,并且指定一个指针接收分配的内存首地址,之后就可以通过指针变量p来访问内存,内存没有名字,所以是匿名访问
/* 存在申请失败的可能,所以应该使用 */
if(NULL != p)
/* 来验证内存确实是分配成功了 */
/* 内存释放之后,需要把p的值变为NULL, 否则会出现野指针 */
p = NULL;
参考:https://www.zhihu.com/answer/2507123829
往期推荐