C++重复调用一个函数系统挂起
Posted
技术标签:
【中文标题】C++重复调用一个函数系统挂起【英文标题】:C++ calling one function repeatedly system hang 【发布时间】:2016-04-19 04:48:32 【问题描述】:我在 C++ 中的一个函数遇到了非常严重的问题。这是我的功能
double** Fun1(unsigned l,unsigned n, vector<int>& list,
vector<string>& DataArray)
double** array2D = 0;
array2D = new double*[l];
string alphabet="ACGT";
for (int i = 0; i < l; i++)
array2D[i] = new double [4];
vector<double> count(4, 0.0);
for(int j=0;j<n;++j)
for(int k=0;k<4;k++)
if (toupper(DataArray[list[j]][i])==alphabet[k])
count[k]=count[k]+1;
for(int k=0;k<4;k++)
array2D[i][k]=count[k];
count.clear();
return array2D;
l 的值约为 100,n=1,DataArray 大小为 (50000 x l),列表将包含 0-49999 之间的任意一个数字。 现在我从我的主程序中多次调用这个函数(可能超过 5000 万次)。多达一定次数它非常顺利,但在我的系统挂起的 2/3 分钟后。我找不到这段代码有什么问题。我猜内存变短了,但不知道为什么?
【问题讨论】:
很多new
s,delete
s在哪里?
因为你不用delete[]
。
内存泄漏 (en.wikipedia.org/wiki/Memory_leak) 导致抖动 (en.wikipedia.org/wiki/Thrashing_(computer_science) _
【参考方案1】:
您的代码中缺少相应的delete[]
。
注意[]
,这意味着您正在删除一个数组。如果您忘记添加这些内容,您将冒险进入未定义的领域(N3797 中的 3.7.4.2)。
您可能希望尝试使用std::array
来减轻不得不使用new
和delete[]
的负担。此外,如果像您所说的那样调用它并且循环很小,我会担心数据的一致性。
【讨论】:
如果您忘记添加这些,您只会删除第一个元素。 实际上,这是一种未定义的行为。我已经看到 VC++ 工作正常(至少在旧版本中,这两个运算符被转发到相同的代码)并且 g++ 在new[]
/delete[]
不匹配时崩溃。【参考方案2】:
在 2/3 分钟后,它会非常顺利地进行到一定次数 围绕我的系统挂起
它没有挂起。如果您正在使用linux
或unix
机器检查top (system performance)
。您系统的虚拟内存已满。对每个new
适当地执行delete
或delete[]
【讨论】:
以上是关于C++重复调用一个函数系统挂起的主要内容,如果未能解决你的问题,请参考以下文章