c++ - C++ 中的内存泄漏 : vector functions in loops

标签 c++ vector memory-leaks

我遇到了重复调用多个函数的情况。这是程序的裸模型,它应该如何工作。当迭代次数很大时,程序会耗尽所有内存(在这个最低限度的模型中并不重要),可能是内存泄漏的情况。请建议在这种情况下最好的方法是什么。我是新手。提前致谢。

#include <iostream>
#include <vector>

/* Functions to be called repeatedly (can be in different .cpp files) */
std::vector<int> Func1(std::vector<int> ttt);
std::vector<int> Func2(std::vector<int> ttx);

int main()
{

    std::vector<int> temp1;
    std::vector<int> temp2;

    for (int jj = 1; jj <= 50; ++jj)
    {
        std::vector<int>vect0;

        vect0.push_back(0);

        for (int i = 1; i <= 500; ++i)
        {
            vect0.push_back(rand()%100);
        }

        temp1 = Func1(vect0);

        // some other oprations on temp1
        temp2 = Func2(temp1);

        temp1 = temp2;

        // some other operations of calling similar functions
    }
    return 0;
}
// ---------------------------------------------
// Functions:
//Func1
std::vector<int>Func1(std::vector<int> ttt)
{
    std::vector<int>tt2(ttt.size(), 0);

    for (unsigned int ii = 1; ii < ttt.size(); ++ii)
    {
        tt2[ii] = ttt[ii] - rand() % 100;
    }

    std::vector<int>tt3 = Func2(tt2);

    return tt3;
}

//Func2
std::vector<int>Func2(std::vector<int> ttx)
{
    std::vector<int>txx(ttx.size(), 0);

    for (unsigned int ii = 1; ii < ttx.size(); ++ii)
    {
        txx[ii] = ttx[ii] % ii;
    }

    return txx;
}

最佳答案

通过引用将您的 std::vector 传递给您的函数并就地修改它们。这将摆脱所有复制,这似乎毫无意义,因为您似乎没有使用原件。

旁注:

for (int i = 1; i <= (rand() + 1); ++i)

这将为每次迭代生成一个随机数,这可能不是您想要的(除了毫无意义的未优化之外,它还会破坏您的概率分布)。您应该生成并存储最大索引,然后在以下条件中使用它:

for (int i = 1, max = rand() + 1; i <= max; ++i)

编辑:关于概率偏差(是的,它实际上并不相关,但现在让我很痒):

令 N 为 RAND_MAX + 1。

max 的预期值为 N/2。非常简单,因为它是均匀分布。

现在针对重复 rand() 的情况。设 S(n) 为在迭代 n 处停止的概率(假定我们已经到达它)。 for 条件中的公式给出了 P(Sn) = n/N。

令 X 为最后一次迭代的次数。现在达到迭代 n 的概率是多少?嗯,就是继续 n-1 次,停止 1 次的概率。由于所有随机生成都被认为是独立的,因此我们将其全部乘积。

P(X=n) = Pi[i=0 到 n-1](1-P(Sn)) * P(Sn) = Pi[i=0 到 n-1](1-i/N ) * n/N

现在这个……东西的预期值(value)是多少?只是按概率计算值的加权平均值,所以让我们开始吧。

E(X) = Sigma[j=0 到 N](j * P(X=j)) = Sigma[j=0 到 N](j * Pi[i=0 到 j-1](1 -i/N) * j/N)

现在我就到此为止了,因为我的数学时代已经一去不复返了。但是,如果您手头有一个科学计算器,您就会得到结果并能够看到分布偏向哪个方向。或者我完全失败了。

编辑 2: 是的,一个计算器。或者 Wolfram Alpha .这个网站太棒了。无论如何,我用 N = 500 测试了它,预期值从 250 下降到 25 左右。所以,是的。

关于c++ - C++ 中的内存泄漏 : vector functions in loops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25354091/

相关文章:

c++ - 检查方法的模板特化是否存在

c++ - 是否可以将 unique_ptr 存储在 QPairs 的 QList 中?

c++ - 计算空字符单元格 C++

c++ - std vector 中数据类型的初始化

ios - 尽管使用较弱的委托(delegate)保留圈

c++ - 我可以返回 std::thread

c++ - 使用 deque 实例化 priority_queue 无法编译 - 使用 vector 则可以。这是为什么?

无法打开引用 vector 文件。它是什么?

c - 有没有办法转储所有 native 内存?

java - 即使没有 GC 根,类加载器也不会被垃圾回收