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