学习
实践
活动
专区
工具
TVP
写文章

C言中的指针和内存泄漏

原文出处: IBM developerworks 引言 对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。 指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在 C言中拥有的最强大工具。 本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密。 本文内容包括: 导致内存破坏的指针操作类型 在使用动态内存分配时必须考虑的检查点 导致内存泄漏的场景 如果您预先知道什么地方可能出错,那么您就能够小心避免陷阱,并消除大多数与指针和内存相关的问题。 内存泄漏 内存泄漏可能真正令人讨厌。下面的列表描述了一些导致内存泄漏的场景。 重新赋值 我将使用一个示例来说明重新赋值问题。 该内存位置的第三个字节又指向某个动态分配的 10 字节的内存位置,如图 6所示。 图 6. 动态分配的内存 ?

1.1K50

C++栈展开如何防止内存泄露

如果被释放的变量中有指针,而该指针在此前已经用new运算申请了空间,就有可能导致内存泄露。因为栈展开的时候并不会自动对指针变量执行delete(或delete[])操作。 因此,在有可能发生异常的函数中,可以利用“智能指针”unique_ptr来防止内存泄露。参考如下程序。 (1)在函数uniqueptrtest1()中,由于异常的发生,导致delete pa;无法执行,从而导致内存泄露。 这样,就不会发生内存泄露了。 (4)由于已经对*和->操作符进行了重载,所以可以像使用普通的指针变量那样使用unique_ptr< T>对象,如上面程序中的pa->show()。 ---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[P371-P373]

62230
  • 广告
    关闭

    新年·上云精选

    热卖云产品新年特惠,2核2G轻量应用服务器9元/月起,更多上云必备产品助力您轻松上云

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++栈展开如何防止内存泄露

    如果被释放的变量中有指针,而该指针在此前已经用new运算申请了空间,就有可能导致内存泄露。因为栈展开的时候并不会自动对指针变量执行delete(或delete[])操作。 因此,在有可能发生异常的函数中,可以利用“智能指针”auto_ptr来防止内存泄露。参考如下程序。 (1)在函数autoptrtest1()中,由于异常的发生,导致delete pa;无法执行,从而导致内存泄露。 (2)auto_ptr实际上是一个类模板,在名称空间std中定义。 这样,就不会发生内存泄露了。 (4)由于已经对*和->操作符进行了重载,所以可以像使用普通的指针变量那样使用auto_ptr< T>对象,如上面程序中的pa->show()。 ---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[P371-P373]

    30410

    java与c++内存泄露的问题

    以前用c++,现在用java我发现两种语言用法上区别不太大,但是在编程思路上却又区别,c++什么都要自己做,但是如果做的很严谨是不会出现内存泄露的问题,但是c++太灵活以至于可用性确实降低了 ,什么都需要自己考虑,而java在内存回收上有垃圾回收机制,在可用性上比c++要好一点,但是java的内存泄露却更加的隐蔽,今天我来谈谈java与c++内存泄露的区别: 1.c++的内存泄露的概念很简单 ,就是你手动申请内存了,但是却没有释放,导致内存泄露。 但是这种问题很是明显,如果细心查找应该能查找出来 2.java的内存泄露:很多书上对java的内存泄露是这么解释的,内存泄露就是你以后都不会再使用的实例,没有被垃圾回收这样就会发生内存泄露,这个问题其实有点模棱两可 很明显,java中的内存泄露c++中的内存泄露复杂的多,而且要隐蔽的多,所以现在想起那句话,我才理解,为什么说垃圾回收是一堵高墙,搞java的人想出去,搞c++的人想进去,我认为这就是两种语言有利有弊

    9610

    浅谈C++中的那些内存泄露

    尽管学过C语言。可是C++里面的一些基础还是不太懂,还须要再掌握。 老范也開始要讲C++设计模式了,必须快点看了。不然就要白花窝滴钱了。 对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间,用完这块空间后却没有释放。 今晚上我就犯了这种低级错误,导致程序没有执行出来。 就会出现以下的结果: 原因是new了,却不没delete,造成内存泄露。在程序执行过程中析构函数是不会调用的,直到整个程序结束。系统才会自己主动释放内存。 2. 继承(兼容规则),多态的知识,在C++涉及模式中,95%都用到了多态性,无疑这是C++的重点,一定要好好学习这一块。 关于C++中,指针delete删除值得问题。

    11210

    Visual C++内存泄露检测工具(VLD)

    简述 C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。 VLD VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。 相比较其它内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点: 可以得到内存泄漏点的调用堆栈,如果可以的话,还能得到其所在文件及行号; 可以得到泄露内存的完整数据; 可以设置内存泄露报告的级别; 报告列出了内存泄露是在第几块、所在的地址、泄露的字节、调用的堆栈、内存内容。双击调用堆栈可以跳转到所在行。 这也是美中不足的一点,如果使用 Qt,只能先使用 VC++ 编译器捕捉并解决内存泄露,再考虑使用 mingw(gcc/g++)编译程序。 更多参考 VLD

    3.8K70

    C 语言内存泄露很严重,如何应对?

    内存泄漏问题原理 1. 堆内存C 代码中的存储方式 内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈内存会自动分配和释放。 C 代码中堆内存的申请函数是 malloc,常见的内存申请代码如下: char *info = NULL; /**转换后的字符串**/ info = (char*)malloc(NB_MEM_SPD_INFO_MAX_SIZE 其实这两类方法的本质是一样的,都是函数内部间接申请了内存,只是传递内存的方法不一样,方法一通过返回值传递内存指针,方法二通过参数传递内存指针。 3. 内存释放误区 稍微使用过 C 语言编写代码的人,都应该知道堆内存申请之后是需要释放的。但为何还这么容易出现内存泄漏问题呢? ,就完全没有释放内存的意识,内存泄漏问题就自然产生了。

    7920

    C言中内存分布及程序运行加载过程

    一个程序内存分配: 下图是APUE中的一个典型C内存空间分布图(虚拟内存) ? printf("打印各局部变量的内存地址\n"); printf("0xx\n",&v1); //打印各本地变量的内存地址 printf("0xx\n",&v2); printf 可以大致查看整个程序在内存中的分配情况: 可以看出,传入的参数,局部变量,都是在栈顶分布, 随着子函数的增多而向下增长. 函数的调用地址(函数运行代码)(高地址) 而malloc分配的堆则存在于这些内存之上,并向上生长 全局变量,静态变量都是在分配内存的低部存在(低地址) 程序如何装载的 1 编译: ? version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xd66ac36636c4fcfcbe395efb6bbd38c053e1c6c7

    1.3K80

    C++11】 使用C++11解决内存泄露--智能指针

    众所周知,C#和java中不需要开发人员自己释放内存,对象引用计数为零后.Net和Java虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,在堆上分配的内存必须自己去管理,不用的时候要自己释放 ,如果管理不当就可能会出现内存泄露C++11提供了智能指针,使用智能指针后不需要用户自己释放内存空间,一旦使用时对象超出了自己的生命周期,就会进行自动释放,从而有效解决了内存泄露的问题。 避免循环引用,循环引用会导致内存泄露。 4 总结 智能指针成为C++进行内存管理工具解决内存泄露问题的一件利器,虽然对我们帮助很大,但是依然要在使用时保持高度的警惕,避免因为使用不当导致更多的问题。

    18110

    杂想之一个C++内存泄露案例

    ,还是堆内存泄露。 之前本人写过几篇内存泄露分析的方法: <<微软Debug CRT库是如何追踪C++内存泄露的?>>: 这种做法只适合于小型的项目,而且对于第三方库的内存泄露无法进行检测。 本文旨在通过分析微软Debug CRT库的实现的检测内存泄露的方式,从而阐述自我实现简易C++内存泄露检测的思想。 <<vmmap分析内存泄露问题>>: 虽然也可以用来做内存泄露分析,但是一般本人喜欢用于做辅助分析,可以比较清晰的看出各种类型内存的动态变化。 内存泄露的原因 本次的案例实在是羞愧和读者朋友们分享,因为本人之前写过一篇<<你踩过几种C++内存泄露的坑?>>,这个案例的原因也就是那篇文章的第一个坑。

    13540

    微软Debug CRT库是如何追踪C++内存泄露的?

    本人在之前已经写过四篇关于Windows中如何查找内存泄露的方法,基本上可以帮你找到内存泄露的问题所在。 本人在逛知乎的时候,看到一个问题<<C++不用工具,如何检测内存泄漏?>>, 不乏很多高手的回答。 微软Debug CRT库检测C++内存泄露原理? 我们先来解决上述的两个问题。 问题一: 如何获取函数调用栈? 那么你首先要知道什么时候申请了内存? 看到这里可能有同学会发现了,那还有C++的关键字new和delete呢。首先我们要知道new是C++的关键字,对于有构造函数的类一般做了以下两个事情: 申请对象所需的内存空间。 本文旨在通过分析微软Debug CRT库的实现的检测内存泄露的方式,从而阐述自我实现简易C++内存泄露检测的思想。若平时分析内存泄露问题,建议还是采用本文开头提到的几篇文章的方法。

    18030

    疑难杂症录:C++代码出现内存泄露?不是吧…

    怀疑是有内存泄露,在把流量停掉以后,重启服务。观测到内存仍旧会规律上涨,且一个小时会涨一次。如此规律,让人不得不怀疑是词典更新导致。词典文件是ceph挂载的,会自动更新,所以我几乎没关注过。 尝试了touch了几次词典文件发现,确实词典文件更新会导致内存连续上涨。但诡异的是后来我尝试缩减词典到一个特别小的大小,却观察到机器内存并不会下降!哦?这是词典API本身存在内存泄露的风险吗? 如果说存在词典对象没有被正常delete,那么内存占用应该会继续上涨,而不是趋于稳定。 头疼。一方面内存不会无限上涨,不像是内存泄露;但另一方面词典缩小却不会导致内存占用减少。 这到底是不是内存泄露?或者到底是不是词典更新导致的呢? 尝试了用一些工具来辅助定位是否有内存泄露的风险,但一无所获。 glibc这个策略其实是为了提高内存分配效率的,并且也不会无限占用内存,而是在达到某个平衡点之后内存便不再增长,这也和我所观察到的现象一致。 说到底这其实不算是一次『内存泄露』。

    28730

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 云服务器

      云服务器

      云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。 腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券