循环中每个步骤中内存使用量增加的原因

时间:2018-09-24 10:01:59

标签: c++

我正在尝试使用我自己定义的函数来求解方程组。问题在于,内存使用量在每个步骤中都会增加,并且在一段时间(例如,在循环100个步骤之后)之后,程序会由于内存使用量而中断。 我没有在每个步骤中定义新参数,而只是将参数的值替换为新的计算值。

是否有解决此问题的想法?

    #include <iostream>

using namespace std;
void NAPLConcentration(int n, int m, double* P, double* C, double* D, double* Tx, double* Ty, double* R);

int main()
{
    int i, n = 2500, m = 1000;
    double *P, *C, *D, *Tx, *Ty, *R;
    P = new double[n*m];
    C = new double[n*m];
    D = new double[n*m];
    Tx = new double[n*m];
    Ty = new double[n*m];
    R = new double[n*m];

    for (i = 0; i < n*m; i++)
    {
        P[i] = 70;
        C[i] = 0.5;
        Tx[i] = 0.01;
        Ty[i] = 0.02;
        R[i] = 0.1;

    }


    for (i = 0; i<10000000; i++)
        NAPLConcentration(n, m, P,  C,  D,  Tx,  Ty,  R);


    delete[] P;
    delete[] C;

    system("pause");

    return 0;
}

void NAPLConcentration(int n, int m, double* P, double* C, double* D, double* Tx, double* Ty, double* R)
{
    int i;
    double W, E, N, S;
    double *CNew;
    CNew = new double[n*m];                                     


    for (i = 2; i<n*m-2; i++)
    {
        E = 2 * Tx[i] * Tx[i + 1] / (Tx[i] = Tx[i + 1]);        // the harmonic average of transmissibility of NAPL between ith and (i+1)th in x direction 
        W = 2 * Tx[i] * Tx[i - 1] / (Tx[i] = Tx[i - 1]);          // the harmonic average of transmissibility of NAPL between ith and (i-1)th in x direction
        N = 2 * Ty[i] * Ty[i +2] / (Ty[i] + Ty[i +2]);        // the harmonic average of transmissibility of NAPL between ith and (i+m)th in y direction, north side of thegrid block
        S = 2 * Ty[i] * Ty[i - 2] / (Ty[i] + Ty[i - 2]);          // the harmonic average of transmissibility of NAPL between ith and (i-m)th in y direction, south side of thegrid block

        CNew[i] = (E*(P[i + 1] - P[i])*C[i] - W*(P[i] - P[i - 1])*C[i] + N*(P[i] - P[i])*C[i] - S*(P[i] - P[i])*C[i] + R[i] ) / D[i] + C[i];
    }

    for (i = 0; i<n*m; i++)
        C[i] = CNew[i];

}

2 个答案:

答案 0 :(得分:2)

从更新的代码片段中,我可以看到您正在为CNew分配内存,但从未释放它。您需要调用delete[]释放该内存。

无论如何,您不应该在C ++ 11及更高版本中使用new / delete –查看容器,例如std::vector 1 < / sup>。他们会在不影响性能的情况下避免出现您的问题。

1 std::unique_ptr之类的智能指针,如果您需要更大的灵活性。

答案 1 :(得分:-1)

每次调用NAPLConcentration时,分配的内存为2500 * 1000 * 8字节(假设double的大小为8字节)。这大约是19 MB。

NAPLConcentration被调用100次时,仅此函数分配的总内存为1.9 GB,因为该函数末尾并未删除该内存。

因此,在完成所需的处理后,删除函数中分配的内存。

为避免自己处理内存,可以使用STL容器。在这种情况下,您可以使用动态连续数组,例如vector