Xzh*_*hsh 19 c++ maintenance memory-management
今年夏天,我在图像/视频实验室里一直在我的大学工作.就在最近,我的教授给了我一个由毕业生写的程序,他刚离开程序"修理",因为它"给出了一些错误".
该项目是用C++编写的(似乎是学生代码中反复出现的坏标志).我在VS08中打开了项目,并运行了项目,事实证明,"错误"是一个bad_alloc.果然,内存管理,或更准确地说,缺乏内存管理,就是问题所在.
程序员似乎喜欢在整个代码中混合mallocs,news和new [],绝对没有free,delete或delete [].更糟糕的是,所有对象似乎至少做了4-5个不相关的事情.最重要的是,这是程序员留下的评论:
//do not delete objects, it seems to cause bugs in the segmenter
Run Code Online (Sandbox Code Playgroud)
从我所看到的,有一个很好的不健康的指针和引用的引用组合,所有的值都通过引用单个类函数来改变,这些函数也可能是静态的.在编译时,大约有23个警告 - 比如从double转换为char时可能丢失数据,大约17个未使用的变量等等.像我这样的时候我希望C++在大学中从不存在,并且所有实验室工作都是像python或matlab一样完成......
所以现在,教授希望我"弄乱"这个程序,这样它就可以运行大约比以前大10倍的数据集.我承认,我有点害怕告诉她代码是垃圾.
StackOverflow,你们之前从未失败过,提出好的建议,所以现在我恳求,任何关于处理这类情况的建议都会受到很多赞赏.
编辑 代码大约是5000 LoC
EDIT2 教授决定采用最简单的方法.哪个内存越来越多.是的,因为要在这个问题上投钱......
wad*_*rld 23
首先,糟糕的代码是糟糕的代码.Python,Java,Matlab或其他任何垃圾收集不是==好的代码.您可以轻松地花时间调试糟糕的Python代码.
话虽如此,绝对是教授的前期.告诉她代码很糟糕并向她展示一些例子.你能做的最糟糕的事情是试图隐藏问题.如果你这样做,问题不仅在于你的膝盖,而且肯定会被归咎于你.
弄清楚最佳解决方案是什么,并向她提出建议.它可能正在修复该代码,获得计算机科学系的帮助,或者用C++或其他语言重写它.很可能她没有任何其他选择,并乐意接受你提出的任何解决方案.
zwo*_*wol 15
重构代码,一次更改一次,直到对您有意义为止.最重要的不是确切的编码策略,而是您了解它正在做什么以及为什么.
你可能最终会触及每一行代码,所以不要试图以任何特定的顺序做事 - 先把你跳出来的东西弄错,然后继续下一个,等等上.例外:如果前一个人没有使用一致的代码格式化策略,则通过自动提交器运行整个事件作为您的第一个操作.
随你写一个测试套件.
sbi*_*sbi 10
说实话.立即告诉你的教授代码是垃圾,为什么这样.如果您在问题中列出的内容是真的,那么代码确实是废话.
你有多少时间在手边?你了解实现的算法吗?
5kLoC并不是那么多,特别是当它都是低级别的小摆动时.当您了解基础算法并且手头有足够的时间时,将其重写为2k行容易理解的代码可能比尝试修复它更好.
5000 LoC也不错.算你自己幸运.
由于听起来内存管理是最大的问题之一,我会从那里开始.
malloc带new.我建议遵循Michael Feathers在他的"有效使用遗留代码"一书中概述的一些步骤.即:尽快获取测试代码.
通过执行功能的单元测试可以为您提供可以自由重构而无需担心的内容.
但是,我知道说这个比实际做得容易得多.阅读本章关于Seams(您可以覆盖/挂钩的代码部分,以便您更容易地获得测试代码):http://www.informit.com/articles/article.aspx? p = 359417&seqNum = 3 另见CppUnit和CppUnitLite,一个用C++进行单元测试的框架:http://c2.com/cgi/wiki?CppUnitLite
通过内存分析器运行代码.请参阅此SO链接:https://stackoverflow.com/questions/818673/memory-profiler-for-c 这将帮助您找到开始添加删除/免费语句所需的位置.我也会开始尝试在其使用的API中使内存分配至少保持一致.