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 分钟后。我找不到这段代码有什么问题。我猜内存变短了,但不知道为什么?

【问题讨论】:

很多news,deletes在哪里? 因为你不用delete[] 内存泄漏 (en.wikipedia.org/wiki/Memory_leak) 导致抖动 (en.wikipedia.org/wiki/Thrashing_(computer_science) _ 【参考方案1】:

您的代码中缺少相应的delete[]

注意[],这意味着您正在删除一个数组。如果您忘记添加这些内容,您将冒险进入未定义的领域(N3797 中的 3.7.4.2)。

您可能希望尝试使用std::array 来减轻不得不使用newdelete[] 的负担。此外,如果像您所说的那样调用它并且循环很小,我会担心数据的一致性。

【讨论】:

如果您忘记添加这些,您只会删除第一个元素。 实际上,这是一种未定义的行为。我已经看到 VC++ 工作正常(至少在旧版本中,这两个运算符被转发到相同的代码)并且 g++ 在 new[]/delete[] 不匹配时崩溃。【参考方案2】:

在 2/3 分钟后,它会非常顺利地进行到一定次数 围绕我的系统挂起

它没有挂起。如果您正在使用linuxunix 机器检查top (system performance)。您系统的虚拟内存已满。对每个new 适当地执行deletedelete[]

【讨论】:

以上是关于C++重复调用一个函数系统挂起的主要内容,如果未能解决你的问题,请参考以下文章

Visual 2015 C++ 编译器:使用对象调用静态成员不会导致编译器错误 [重复]

调用C++类中另一个头文件中定义的函数[重复]

如何在 C++ 中调用基类构造函数 [重复]

在其派生类C++的构造函数中调用基类的构造函数[重复]

继承C ++为啥不调用父亲构造函数[重复]

如何从按钮异步长流程[重复]