c++中的内存泄漏:循环中的向量函数

Memory leak in C++ : vector functions in loops

本文关键字:向量 函数 循环 泄漏 内存 c++      更新时间:2023-10-16

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

#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)

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

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

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

设N为RAND_MAX + 1

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

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

设X为最后一次迭代的次数。现在到达第n次迭代的概率是多少?它是连续n-1次,停止1次的概率。因为所有的随机代都被认为是独立的,所以我们取它们的乘积。

p (X = n) =π(i = 0到n - 1) (1 - p (Sn)) * p (Sn) =π(i = 0到n - 1)(我)/n * n/n

这个…的期望值是多少?的事情吗?简单地用它们的概率加权平均值,所以让我们开始吧。

E (X) =σ[j = 0到N] (j * p (X = j)) =σ[j = 0到N] (j *π(我= 0 j - 1)(我/N) * j/N)

现在我就讲到这里,因为我的数学时代已经过去很久了。但如果你手边有一台科学计算器,你就能得到结果,并能看到分布偏向哪个方向。或者我彻底失败了。

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