前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈C语言程序内存泄漏

浅谈C语言程序内存泄漏

作者头像
混说Linux
发布2022-07-14 20:39:45
1.5K0
发布2022-07-14 20:39:45
举报
文章被收录于专栏:混说Linux混说Linux

1

1. 结构体成员指针未初始化

代码语言:javascript
复制
struct student
{
    char *name;  //这里只是分配了4个字节,没有指向一个合法的地址,内部是一些乱码    
    int score;
}stu, *pstu;

int main()
{
    strcpy(stu.name, "code"); //所以这里会出错,解决方法就是为name指针malloc一块空间    
    stu.score = 99;
    return 0;
}

另一种错误:

代码语言:javascript
复制
int main()
{
    pstu = (struct student *)malloc(sizeof(struct student)); //这里还是没分配name内存,只是以为分了而已。
    strcpy(pstu->name, "code");
    pstu->score = 99;
    free(pstu);
    return 0;
}

上面两种方式运行的结果:

2.结构体指针内存分配不够

代码语言:javascript
复制
int main()
{
    pstu = (struct student *)malloc(sizeof(struct student *)); //这里写错了 sizeof(struct student),导致内存不足
    strcpy(pstu->name, "code");
    pstu->score = 99;
    free(pstu);
    return 0;
}

和前面运行的结果一样:

3. 内存越界

内存分配成功,且已经初始化,但是操作越过了内存的边界。

这种错误经常是由于操作数组或指针时出现“多 1”或“少 1”。比如:

代码语言:javascript
复制
int a[10] = {0};
for (i=0; i<=10; i++) //这里就越界了,多了一个
{
    a[i] = i;
}

所以, for 循环的循环变量一定要使用半开半闭的区间,而且如果不是特殊情况,循环变量尽量从 0 开始。

4. 内存泄漏

一般是malloc或者new操作符分配的内存,若用完之后没有及时free或者delete,这块内存就没法释放,知道程序结束。

代码语言:javascript
复制
(void *)malloc(int size)  //函数原型

/* 具体使用 */
char *p = (char *)malloc(100);  //需要强制转换类型,并且指定一个指针接收分配的内存首地址,之后就可以通过指针变量p来访问内存,内存没有名字,所以是匿名访问

/* 存在申请失败的可能,所以应该使用 */
 if(NULL != p)
/* 来验证内存确实是分配成功了 */

/* 内存释放之后,需要把p的值变为NULL, 否则会出现野指针 */
p = NULL;

参考:https://www.zhihu.com/answer/2507123829

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 混说Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档