Другие языки программирования и технологии

помогите найти утечку в памяти Builder С++

Короче в Run когда запускаю все работает, закрываю окно все нормально, когда запускаю exe все работает, но при закрытии выскакивает ошибка памяти....Если кому не сложно помогите... void Raschet() { //Выделяем память под диагонали матрицы int count = int(M1); int i; double* Ap = new double[count+1]; double* Bp = new double[count]; double* Cp = new double[count]; double* Dp = new double[count]; //Заполняем диагонали для первой системы Bp[0] = -(Gm + Gf + 2*Qc); Cp[0] = Qc; Dp[0] = -Gm; for (i=1; i<count-1;i++)> = -(Gm + Gf + 2*Qc); Cp = Qc ; Dp = 0; } Ap[count-2] = -1; Bp[count-1] = 1; Dp[count-1] = 0; //Решаем систему методом прогонки (результат в cpl) cpl = progonka(Ap,Bp,Cp,Dp,count); Xm = cpl[count-1]; Xb = 1-Xm; //Формирование диагоналей для второй системы for (i=0; i<count;i++)> = cpl*cp_m + (1-cpl)*cp_b; cp_smes = cpl[count-1]; double Qa = Vs*nu*exp(-b*(Tmelt + 273))*pow(((Vscr - Vb*sin(fi))/H),n+1.0); Bp[0] = -2*alfa_b*Fb - 2*alfa_scr*Fscr - (Gm + Gf + Qc)*cpl[0]; Cp[0] = Qc*cpl[1]; Dp[0] = -(Gm*cp_m*Tmelt + Gf*cp_b*(Tb3 + 2.0) + 2*alfa_b*Fb*Tb3 + 2*alfa_scr*Fscr*Tscr + 2*Qa); for (int i=1; i<count-1;i++)> = -2*alfa_b*Fb - 2*alfa_scr*Fscr -(Gm + Gf + 2*Qc)*cpl; Cp = Qc*cpl[i+1] ; Dp = -(2*alfa_b*Fb*Tb3 + 2*alfa_scr*Fscr*Tscr); } Ap[count-2] = (Gm + Gf + Qc)*cpl[count - 2]; Bp[count-1] = -2*alfa_b*Fb - 2*alfa_scr*Fscr -(Gm + Gf + 2*Qc)*cpl[count-1]; Dp[count-1] = -(2*alfa_b*Fb*Tb3 + 2*alfa_scr*Fscr*Tscr); //Решаем систему методом прогонки T0 = progonka(Ap,Bp,Cp,Dp,count); for (i=0; i<count;i++)>Series1->Add(T0,i+1,clRed); Form1->StringGrid1->Cells[0][i+1] = i+1; Form1->StringGrid1->Cells[1][i+1] = SimpleRoundTo(T0, -2); } //Освобождаем память delete [] Ap; delete [] Bp; delete [] Cp; delete [] Dp; }
Вообще-то, в ваших каракулях нет никакой радости разбираться. Тем не менее, во-первых, вызывает сомнение следующий код

for (i=0; i<count;i++)>Series1->Add(T0,i+1,clRed);
Form1->StringGrid1->Cells[0][i+1] = i+1;
Form1->StringGrid1->Cells[1][i+1] = SimpleRoundTo(T0, -2);
}

Какова размерность Cells по второму индексу? В цикле второй индекс получает значение, равное count. Если размерность Cells равна count, то уже здесь вы нарушили границы.

Далее внутри функции progonka у вас есть код

double *result;
if (np <= 0)
{
return result;
}

Чему равно значение result по выходу из функции? Оно может быть каким угодно, так как вы не инициализировали эту переменную, и любой мусор, который находится по этому адресу, будет возвращен.

Далее, там же

result = (double*)calloc(np, sizeof(double));
double* a1 = (double*)calloc(np-1,sizeof(double));
double* t = (double*)calloc(np,sizeof(double));

Вы используете функции calloc(). Какой смысл их использовать вместо оператора C++ new?! И где вы освобождаете эту память с помощью функции free()?

P.S. Самое главное - не забудьте мне поставить 10 баллов за лучший ответ! А то в следующий раз просто проигнорирую!
ЛМ
Леонид Мишунин
79 586
Лучший ответ
Так, а эта память где освобождается?
===============================
result = (double*)calloc(np, sizeof(double));
double* a1 = (double*)calloc(np-1,sizeof(double));
double* t = (double*)calloc(np,sizeof(double));

Кроме того, какого типа ошибка возникает при закрытии?
И вообще, нехорошо, когда после вызова функции, нужно освобождать память из-под указателя, который она возвращает...