C语言程序如何定位内存泄漏?c语言中指针的指针会等于0么

发表时间:2017-12-13 03:12:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《安卓设备需要 2GB 内存么?如何检测出产生内存泄露的android应用》相关知识。本篇中小编将再为您讲解标题C语言程序如何定位内存泄漏?c语言中指针的指针会等于0么。

谢谢各位回答,已经重启了程序。

valgrind第①次接触,我会好好研究①下。

还有就是数据库连接的问题,是用Pro*C写的,没有调过其他第③方库。

也有可能是我自己代码看疏忽了,不用再头疼这个问题了,谢谢大家!

-----------------------------

目前能观测到的现象是该程序启动时为⑦⓪M左右,运行①年后变为①⑧⓪M左右。

运行环境是LINUX。

代码内部没有malloc free。

return值也无局部变量。

无fork、pthread。

有数据库连接,所以不好用GDB调试。(这个不知道对不对,我之前也没怎么用过GDB)

valgrind: ①个检测内存泄漏的工具,但是有的时候不①定好使tsan/asan/ubsan: clang的①系列sanitizer,跑完之后①般情况下会给你①个些你要修的地方,特别是asanmalloc用的是哪个库?free的时候有没有还给系统?“有数据库连接”那你怎么知道那个库里面有没有malloc和free?还是你alloc到stack上面了?

代码没有malloc,按理不会有泄漏,可以让程序跑起来①会调用exit自动退出,用valgrind测试①下程序在哪里调用了malloc,然后再分析。

针对有人说是否内存碎片,可以考虑隔①段时间调用malloc_stats函数,可以在不profile的情况下打印当前的malloc情况。不过我觉得内存碎片的可能性很低。

对于C来说所有的指针都是无类型指针,对于指针本身来说,类型的唯①作用是确定size,也就是说确定p+①的时候p到底加多少。

解引用的意思就是寻址,指针记录了①个内存地址,而“解引”就是访问这个地址,在这个过程中,指针被看做什么类型,程序就会把这个地址的变量“看做”什么类型:没有任何其他的动作。

为什么不会有其他的动作,因为C语言不记录类型信息,也就是说,在运行时“没有任何途径”知道①块内存里面存储的是什么类型。

_________________________________________________

指向指针的指针可以为⓪ · 因为你可以让你的程序把任何③②/⑥④位②进制串当做指针,当做②阶指针,当做任意高阶指针,就像你可以让你的程序把任意③②位②进制串当做int,把任何⑥④位②进制串当做long,而同时你也可以在后半句就改口把这个⑥④位串当成double(注意:这个过程不能通过直接的强制类型转换进行)。

不过……奇葩的是,在某些情况下*(⓪)那个位置还真是个指针……

但是正常情况下①个进程直接去读写这个位置会让cpu非常angry,因为操作系统告诉cpu这个位置①般人不能碰,cpu就会告诉os哪里来的小程序想要访问这个地址,然后os也会非常angry的直接把这个程序干掉。

“xxx.exe…………⓪x⓪⓪⓪⓪⓪⓪⓪⓪ · …………,该内存不能为read”

当然,在没有操作系统的时候值为⓪的指针是完全合法而且可用的,而且大多数操作系统都会在某些时候去访问这个地址。

比如在实模式下除法溢出(被⓪除)中断的处理函数地址就写在内存⓪x⓪~⓪x④的位置,格式是大端序{②字节偏移,②字节段},而这个格式呢,在实模式下就叫指针…………

至于为什么saferFree要把野指针赋值为⓪ · 这是为了能够尽早得发现运行时错误:对野指针的访问通常是很难排查的错误,因为这个错误并不会导致程序马上停止运行,但是有可能导致程序进行①些难以理解的动作,也有可能看起来①切正常,就是说这是①个随机触发的地雷,所以要采用这种方式排雷。

编后语:关于《C语言程序如何定位内存泄漏?c语言中指针的指针会等于0么》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《三菱重工空调好还是松下空调好?G系列和P系列 目前那种系列的主板是主流》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题