Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理代码维护的建议_C++_Memory Management_Maintenance - Fatal编程技术网

C++ 处理代码维护的建议

C++ 处理代码维护的建议,c++,memory-management,maintenance,C++,Memory Management,Maintenance,今年夏天,我在我的大学里的一个图像/视频实验室工作。就在最近,我的教授给了我一个由一名研究生编写的程序,他刚刚离开该程序去“修复”,因为它“出现了一些错误” 该项目是用C++编写的(在学生代码中似乎是一个重复的坏符号)。我在VS08中打开了这个项目,然后运行了这个项目,结果发现,“错误”是一个错误。果不其然,内存管理,或者更准确地说,缺乏内存管理,就是问题所在 程序员似乎喜欢在整个代码中混合mallocs、news和news[],绝对没有free、delete或delete[]。更糟糕的是,所有

今年夏天,我在我的大学里的一个图像/视频实验室工作。就在最近,我的教授给了我一个由一名研究生编写的程序,他刚刚离开该程序去“修复”,因为它“出现了一些错误”

该项目是用C++编写的(在学生代码中似乎是一个重复的坏符号)。我在VS08中打开了这个项目,然后运行了这个项目,结果发现,“错误”是一个错误。果不其然,内存管理,或者更准确地说,缺乏内存管理,就是问题所在

程序员似乎喜欢在整个代码中混合mallocs、news和news[],绝对没有free、delete或delete[]。更糟糕的是,所有的对象似乎至少做了4-5件不相关的事情。最重要的是,这里有一条程序员留下的评论:

//do not delete objects, it seems to cause bugs in the segmenter
据我所见,指针和引用的引用混合在一起,所有的值都是通过引用传递给单片类函数来改变的,这些函数也可能是静态的。在编译时,大约有23条警告——比如从双到字符转换时可能丢失的数据,大约17个未使用的变量等等。现在是这样的,我希望C++永远不存在于大学中,而且所有的实验室工作都是在Python或Matlab……/P>中完成的。 所以现在,教授想让我“摆弄”这个程序,这样它可以在比以前大10倍的数据集上运行。我承认,我有点害怕告诉她密码是垃圾

StackOverflow,你们从来没有失败过,提供了很好的建议,所以现在我恳求,任何关于处理这种情况的建议都将不胜感激

编辑 代码大约是5000 LoC

EDIT2
教授决定采用最简单的方法。这是越来越多的内存。很感谢你要花钱解决这个问题……

在我看来,最好的办法是告诉教授代码乱七八糟,除非重写某些部分,否则无法按预期工作。建议进行一次小的代码重构,只重写需要它的部分(而不是整个程序)


不说这些,可能会给您带来更多的问题:)

重构代码,每次修改一次,直到对您有意义为止。最重要的不是确切的编码策略,而是您了解它在做什么以及为什么

你可能会接触到每一行代码,所以不要试图按照任何特定的顺序来做事情——首先修复第一件突然出现的错误,然后继续下一件,依此类推。例外情况:如果前面的人没有使用一致的代码格式策略,那么作为第一个操作,通过自动缩进器运行整个过程


编写测试套件。

首先,坏代码就是坏代码。Python、Java、Matlab或任何其他垃圾收集的代码都不好。您也可以轻松地花时间调试糟糕的Python代码

话虽如此,但绝对要与教授坦诚相见。告诉她代码不好,给她看一些例子。你能做的最糟糕的事情就是试图隐藏问题。如果你这样做,问题不仅肯定会落在你的膝盖上,而且肯定会归咎于你


找出最好的解决方案并向她提出。它可能是修复代码,征集计算机科学部门的帮助,或者改写它,无论是C++还是其他语言。很有可能她没有任何其他选择,并且很乐意接受您提出的任何解决方案。

作为权宜之计,您可以尝试使用某种垃圾收集内存管理工具,如dlmalloc,看看这是否允许您暂时克服内存不足的障碍

从长远来看,您将不得不清理内存管理混乱——根本没有办法解决。根据您的描述,您可能还必须解决对象设计问题,但您可能可以先进行一些内存管理清理

以下是我的方法:

  • 查找代码中调用
    malloc()
    的所有位置。仔细查看它们,并尝试用调用
    new
    来替换它们,这样您只需要处理单一类型的内存管理,这将使您更容易进入下一步
  • 查找调用
    new
    的所有位置,并查看是否可以将
    new
    结果分配给的原始指针替换为
    boost::shared_ptr
    。这至少应该给你一些穷人的垃圾收集;当然,您还应该更改接收这些指针的函数的所有函数原型,以采用
    shared\u ptr
    而不是原始指针,否则您只是粉饰了混乱,并没有真正改进任何东西。事实上,我认为你把事情变得更糟了

一旦解决了即时内存管理问题,就可以开始重构对象并改进设计。我不会先修复设计,你最好让软件正常工作,对其工作原理有更多的了解,然后再整理设计,否则你可能会用另一个来替换一个烂摊子。

听起来像一个烂摊子。重构是您至少需要做的事情。new's和malloc's的混合是一种灾难

我想你可能得重写整个故事。幸运的是,5000 SLOC规模不大,不需要太长时间


听起来是个很好的锻炼

我建议遵循Michael Feathers在《有效使用遗留代码》一书中概述的一些步骤。即:尽快测试代码

使用单元测试来实现这些功能将使您可以无所畏惧地自由重构

然而,我知道
Type* data = (Type*)malloc(123*sizeof(Type));
std::vector<Type> data(123);