【发布时间】:2019-11-14 23:59:44
【问题描述】:
我正在开发一个程序,它充当一个非常简单的投票系统,它从文件中读取数字,将文件中的数字转换为 unsigned int 类型。
以下是 txt 文件中数据的示例:
1 34 2 50 23 12
1 30 5 17
5
30 2 3 22
23 45
每一行是一个人的投票,每行上的数字是这个人的候选人偏好,左边是第一偏好,右边是最后偏好。
一旦从文件中读取所有数据,它就会进入一个无限循环,其中每一轮(迭代)它都会计算剩余的候选人(即淘汰得票最少的候选人)。当找到具有多数票的候选人时,程序以代码 0 退出。
我的问题是使用 g++ 编译器,大约在 40 左右,程序开始变慢,我假设这是因为内存泄漏,但是我不知道它可能在程序中的哪个位置泄漏.
This is what I get when debugging the program through Deleaker.
注意:谢谢大家的帮助。但是,尽管我不想这样做,但由于某些原因,我需要编辑此处发布的代码。我不会删除帖子,以防有人能以某种方式找到答案。希望您能理解,谢谢。
【问题讨论】:
-
这是调试器和/或分析器的工作。使用
-Og -g选项编译程序后,分析器(例如perf)会告诉您大部分时间都花在了哪里。调试器(例如gdb)允许您在有问题的部分中断程序并逐个执行指令,以查看与您预期不同的情况。这不太可能是内存泄漏问题(您没有使用new或类似的东西)。更有可能是您的算法具有意外的大运行时间。 -
还要确保在不进行调试时,您使用
-O2或-O3优化标志到g++。 -
我没有看到任何暗示“内存泄漏”的迹象。一切都使用容器。在任何会导致泄漏的地方都没有看到
new。显示的代码偏大,需要分析;但根据给定的描述,它更有可能是一个糟糕或低效的算法。 -
您的代码中有很多分配。大量复制大型对象。
-
我刚刚意识到,通过图像,您在 Windows 上。在这种情况下,我对探查器和调试器的建议不适用(即
perf和gdb不适用于 Windows)。我不知道 Windows 上常用的分析器和调试器是什么。
标签: c++ performance memory-leaks