重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 145|回复: 2

关于指针的问题

[复制链接]

20

主题

73

帖子

380

积分

学生管理组

Rank: 8Rank: 8

积分
380
发表于 2018-7-22 22:57:32 | 显示全部楼层 |阅读模式
最近被人问到一个这样的问题:
        假设某程序定义了一个全局gPtr,初始化时malloc了很大的一块内存区域(malloc执行是成功的),程序运行中若干线程都会使用到gPtr,但是都不会去释放它。当程序运行了若干天之后,程序崩溃了,定位发现gPtr的值变成了一个很小的值(如0x20) ,gPtr变为非法值可能的原因有哪些
回复

使用道具 举报

20

主题

73

帖子

380

积分

学生管理组

Rank: 8Rank: 8

积分
380
 楼主| 发表于 2018-7-22 23:05:06 | 显示全部楼层
这样的问题在实际的开发中我也遇到过好几次,经常都是一些全局的指针变量在运行过程中莫名奇妙的变得很小,导致在使用指针的时候出现程序崩溃的情况出现。每次遇到这样的问题,我都觉得是踩内存了,然后就在访问全局变量的地方加锁进行保护。通常在加锁保护全局资源后都能把问题解决掉,但是我一直都没真正弄懂过出现指针变小的原因,如果是踩了内存那又有什么比较好的方法可以对踩内存的情况进行排查?
在网上找了好久的资料,也没有找到什么比较靠谱的解释,今天把问题抛出来,希望能有大神赐教!
回复 支持 反对

使用道具 举报

206

主题

496

帖子

2757

积分

学生管理组

Rank: 8Rank: 8

积分
2757
发表于 2018-7-23 22:12:55 | 显示全部楼层
全局gPtr在malloc之后赋值,如果涉及到内存很大的情况,有可能被其他线程把该变量回收,或者就是进程内其他线程本身存在内存泄漏,很容易有这种情况。
建议你先在进程内调用全局gPtr的时候,每次都新开一个变量var,在把全局gPtr赋值给var,来调用,C++的话,就用引用来处理下,
当然加锁也是一种方法,加关键代码段即可
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2018-10-23 15:02 , Processed in 0.101468 second(s), 33 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表