我的程序随着时间的流逝而变慢,我不知道为什么。内存泄漏?

时间:2019-11-14 23:59:44

标签: c++ performance memory-leaks

我正在开发一个程序,该程序的作用非常简单,可以从文件中读取数字,然后将文件中的数字转换为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.

注意:谢谢大家。但是,由于某些原因,我需要尽可能多地编辑此处发布的代码。如果有人可以某种方式在答案中找到用处,我不会删除该帖子。希望您能理解,谢谢。

1 个答案:

答案 0 :(得分:2)

我在这里做出一些猜测,但是就算法的时间复杂度而言,

while (p != vote_collection.end())  {
    //...
    if (p->spent()) {
        p = vote_collection.erase(p);
    }
 }

是有问题的,因为vote_collection是向量。假设N是该容器的大小,即票数。如果p->spent()为真(在以后的迭代中更可能发生),那么您将擦除p。在最坏的情况下(从开始擦除时,从向量中删除元素在N中具有线性时间复杂度,在从头到尾迭代向量时,您可能会这样做)。在他的许多票中,此循环在N中具有二次时间复杂度。如果输入变量可能很大,您总是想避免二次复杂。

之所以如此,是因为向量将元素连续存储在内存中。擦除一个元素时,必须将已擦除一个元素之后的所有其他元素移动一个元素以缩小间隙。这需要在擦除的元素接近开始位置时移动几乎整个矢量。

您可以仅使用矢量来保留所有花费的选票,而不必确保ranked_candidates跳过花费的选票。