我正在尝试使用我自己定义的函数来求解方程组。问题在于,内存使用量在每个步骤中都会增加,并且在一段时间(例如,在循环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];
}
答案 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
。