posts - 9,  comments - 16,  trackbacks - 0
        题目描述很简单:内存泄露了,现象是看到该程序的内存占用率不断增长,作为一个程序员你怎么解决这个问题?

        我答的不好,回来之后又好好的想了想,其实回答这个问题应该从不同的方面来考虑

        首先分析内存泄露容易发生的情况,《OOP启示录》对这些情况都讲得挺详细的,在类的构造函数与析构函数中没有匹配地调用 new/delete!没有正确地清除嵌套的对象指针!在释放对象数组时,没有使用delete [];指向由指向对象的指针构成的数组不等同于与对象数组。缺少拷贝构造函数,编译器缺省添加的拷贝构造函数不足,缺省的拷贝构造函数采用位拷贝!......用我自己的想法描述就是,每次自己分配一块内存区域的时候,都要想到用完之后要将该内存区释放掉!当然特殊的情形这句话不适用。
       既然知道了内存泄露事件的多发地带,我们可以多在这些地方设置检察机制,相对来说就有一点针对性了!面试官说这样是一种解决办法,可能10000个函数,我们可以把错误范围缩小到200个,然后你还有什么办法继续解决这个问题?

      我基本上是把我暂时能想到的都说了,什么设置断点调试啊,用IDE工具看地址变化。。。不过好像都不能达到面试官满意度。。。
      他说没有这样的IDE工具给你用,接着你怎么解决?
      唉。。。受打击了,事实如此,我对这个不够理解。。。

     之后上网想找找内存泄露相关的资料,搜出来的文章大部分都是林锐高质量C++编程里关于内存的那篇,大感失望,怎么就没有其他更好更深入的文章了呢???

     大家讨论讨论,我相信这个问题挺具有代表性的,大家讨论出个结果,都弄懂了岂不是更好?


posted on 2006-05-13 02:42 季浩 阅读(2140) 评论(10)  编辑 收藏 引用 所属分类: 心得体会

FeedBack:
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-13 09:57 | blueice
如果可能的话,分段测试,使用排除定位的方式找到代码段,但这样付出的事件和精力是很客观的!  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-13 10:57 | flyingxu
没有工具用的话,估计内存泄漏是很难检查出来的。有工具干嘛不用?  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-13 11:15 | 音乐虫子
非常同意楼上的,不给你米请问你如何做饭?
你得先在大自然等待一个水稻诞生,然后收集种子,再培育,再收集再培育,到了购量了之后,还要去壳什么的,再去找木头,砖头搭一个炉,然后收集一点铁来打一个锅,最后跑50里到海边打一通水回来,然后开始做饭!

或者,你可以直接到饭店花钱买一碗饭回来就好了。

你可以告诉面试的人,抛弃有内存泄露的软件,买别人的不泄露的,搞定!

  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-13 21:59 | 虾米
我估计面视你的人是想问你如何做好内存管理,这确实不事件容易的事情,也需要对C++的理解更深入一层。

我提一个方法,重载new/delete, 让程序使用一段自己管理的内存空间,这个内存空间大小最好可以变化,但不能频繁发生。在发生内存泄漏时候,报告发生问题的对象或者是过程……  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-14 16:56 | 季浩
有的程序不能用调试的方法,找出错误。。。
IDE有时候对有的程序不支持调试,比如写了一个Windows服务程序,怎么样调试呢? 你能看到内存不断被吃掉,但是总得想办法来解决。。。

虾米兄弟说的方法,我另一个兄弟也说过,感觉想法挺好的
重载new/delete, 让程序使用一段自己管理的内存空间,这个内存空间大小最好可以变化,但不能频繁发生。在发生内存泄漏时候,报告发生问题的对象或者是过程……  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-15 08:48 | 明明
呵呵, 才发现这还有一家子的人呢. 俺也姓季. 呵呵. 常联系   回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-15 10:30 | 空明流转
很明显的,考官是要考验你有没有比较扎实的C++功底和Track的习惯。

其实一般来说程序稍微大一点都是重载了内存分配函数然后使用自己订制的内存分配器监察内存分配情况。适当的时候Log就可以了。  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-16 19:46 | jinti
查内存泄露是需要时间的。最好的方法是养成代码编写习惯
尽量使用智能指针。

查内存的工具有:valgrid, 很好用,可惜在windows下没有.

不过也有一些代码上的技巧, 比如:重载class 的 new和delete操作。记录之后再进行一步一步的排查。  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教
2006-05-27 20:31 | Corner
@jinti
我想在防范措施上以养成良好的编码习惯

在跟踪技巧上可以写一个跟踪对象生存期的Track类,重点是在constructor/destructor和copy constructor里加入一些必要的纪录验证操作或是log输出操作。

在语言的机制上可以重载全局new/delete,对于C code可以写自己的malloc/realloc/free,同时为了保持代码的整洁,可以适当使用一点macro,比如:
#define new mycode::new // mycode::是名称空间
这么做是为了尽可能少的改动原有代码。

当然更有力的技术是SmartPtr/ObjPool, 不过当进入多线程的世界,会使问题更为复杂些,这时关键在于搞清楚你的对象的生存期大于所在的线程,还是小于它.值得注意的是SmartPtr/ObjPool技术会引入一个间接操作,得根据场合进行取舍。  回复  更多评论
  
# re: 前天一道我不能回答好的面试题:内存泄露你怎么解决?希望大家不吝赐教[未登录]
2007-02-03 19:56 | 季浩
呵呵,我和你同名同姓耶,516790691,我的QQ号,蛮想见你的  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(3)

随笔分类(8)

随笔档案(9)

fiends

搜索

  •  

积分与排名

  • 积分 - 15820
  • 排名 - 940

最新评论

阅读排行榜

评论排行榜