누구나 gnuWin32를 사용할 때 런타임 오류가있는 이유를 알아낼 수 있습니까? GaussSeidel 함수에 주석을 달면 오류가 사라집니다. 온라인 GNU GCC v4.8.3 컴파일러를 사용해 보았는데 제대로 작동하는 것 같습니다. ideone.com의 C++ 14에서 런타임 오류가 두 번 무료 또는 손상되었음을 알려주었습니다. 그 오류로 고통받는 내 코드의 간단한 버전을 첨부했습니다. 감사. 함수 내부Double Free or Corrupt Error
#include <iostream>
#include <cmath>
void GaussSeidel(double** const aa, double* const bb, double* xvec, const int nn, int mm)
{
int i = 0, j = 0;
double *ynew=NULL, *yold=NULL, EE=20.0;
ynew=new double[nn];
yold=new double[nn];
while (mm > 0 && EE>0.00001) {
EE=0.0;
for (i = 0; i < nn; i++) {
yold[i]=ynew[i];
ynew[i] = bb[i]/aa[i][i];
for (j = 0; j < nn; j++) {
if (j == i) continue;
ynew[i] = ynew[i] - (aa[i][j] * xvec[j]/ aa[i][i]);
xvec[i] = ynew[i];
}
if (std::abs(ynew[i]-yold[i])>EE) EE=std::abs(ynew[i]-yold[i]);
}
mm--;
}
std::cout << mm << " " << EE << std::endl;
for (j = 0; j < nn; j++)
xvec[i] = ynew[i];
delete [] ynew;
delete [] yold;
}
int main (void)
{
int i, j;
const int Np=100;
double **Infl=NULL, *Source=NULL, *FpdPhi0=NULL;
Source=new double[Np];
FpdPhi0=new double[Np];
Infl = new double *[Np]; for(i = 0; i < Np; i++) Infl[i] = new double[Np];
for (j=0; j<Np; j++){
for (i=0; i<Np; i++){
if (i==j){
Infl[j][i]=1.0;
}
else {
Infl[j][i]=0.0;
}
}
Source[j]=4.0;
FpdPhi0[j]=0.1;
}
GaussSeidel(Infl, Source, FpdPhi0, Np, 300);
for(i = 0; i < Np; i++) delete [] Infl[i];
delete [] Infl;
delete [] Source;
delete [] FpdPhi0;
return 0;
}
'std :: vector'를 사용하여 모든 무의미한 수동 메모리 관리를 제거하십시오. – Chad
또한, 함수에서'new []'를 두 번째 호출하면 예외가 발생하면 GaussSeidel에서 메모리 누수가 발생합니다. 'std :: vector'를 사용하여이 모든 문제를 피하십시오. – PaulMcKenzie
for-loop 인덱스 변수의 범위를 제한하는 것이 좋습니다. – molbdnilo