Форум программистов, компьютерный форум CyberForum.ru

Поиск утечки памяти - C++

Войти
Регистрация
Восстановить пароль
 
proggamer12
17 / 17 / 2
Регистрация: 06.07.2012
Сообщений: 498
Завершенные тесты: 1
21.03.2016, 11:50     Поиск утечки памяти #1
Здравствуйте!
Не могли бы вы помочь мне найти утечку памяти в программе? Весь день искал, все вроде бы удаляется, но 4 мб все равно уходит (вижу по отладчику VS).

Исходный код: есть функция TriDiag (решение трехдиаганольной системы методом прогонки):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
inline double* TriDiagSolve(double A[], double B[], double C[], double F[], int n)
{
 
    double* alpha   = new double[n];
    double* beta    = new double[n];
    double* Y       = new double[n];  // УТЕЧКА ПО ВЕРСИИ ОТЛАДЧИКА
    alpha[0] = B[0] / C[0];
    beta[0] = (-1) * (F[0] / C[0]);
 
    for (int i = 1; i < n; i++)
    {
        alpha[i] = B[i] / (C[i] - alpha[i - 1] * A[i]);
        beta[i] = (beta[i - 1] * A[i] - F[i]) / (C[i] - alpha[i - 1] * A[i]);
    }
 
    Y[n - 1] = beta[n - 1];
 
    for (int i = n - 2; i >= 0; i--)
        Y[i] = alpha[i] * Y[i + 1] + beta[i];
 
    delete[] alpha;
    delete[] beta;
 
 
    return Y;
}
А потом эта функция вызываеся в другом методе:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
double *A = new double[N + 1];  // от 1 до N
    double *C = new double[N + 1];  // от 0 до N
    double *B = new double[N + 1];  // от 0 до N-1, но размерность укажем больше, чтобы цикл был универсальным
    double *F = new double[N + 1];
    double *Y=NULL;
 
    double sin_sqr = pow(sin(M_PI*delta / 2.0 / l), 2.0);
    double l_min = (4.0*sin_sqr) / (1.0 + 2 * sin_sqr);
    omega = 2.0 / (1.0 + pow(l_min*(2.0 - l_min), 0.5f));
    
    do
    {
        for (int n = 1; n < N; n++)
        {
            for (int i = 0; i < N - 1; i++)
            {
                A[i] = -1.0;
                C[i] = -4.0;
                B[i] = -1.0;
 
                F[i] = (1.0 - omega)*(-u[i][n][0] + 4.0*u[i + 1][n][0] - u[i + 2][n][0]) + omega*(u[i + 1][n - 1][1] + u[i + 1][n + 1][0] - delta*delta*f_d(i + 1, n));
            }
 
            Y = TriDiagSolve(A, B, C, F, N - 1);
 
            for (int x = 1; x < N; x++)
                for (int y = 1; y < N; y++)
                    u[x][y][0] = u[x][y][1];
 
            for (int x = 1; x < N; x++)
                u[x][n][1] = Y[x - 1];
        }
 
        for (int n = 1; n < N; n++)
        {
            for (int m = 1; m < N; m++)
            {
                r[m][n] = u[m - 1][n][1] + u[m + 1][n][1] - 4.0 * u[m][n][1] + u[m][n - 1][1] + u[m][n + 1][1] - delta*delta*f_d(m, n);
            }
        }
        v++;
        if (v > 2000)
        {
            cout << "ERROR: слишком долго";
            return;
        }
    } while (get_max_r() >= eps);
 
    delete[] Y; // ХОТЯ Я УДАЛЯЮ
    delete[] A;
    delete[] C;
    delete[] B;
    delete[] F;
Отладчик подсказывает, что утечка возникает на строке с соответствующим комментарием... Но я удаляю этот массив (соответствующая строка помечена комментарием)

Не могли бы вы помочь найти решение. При достаточно высокой точности (10^-10) утекают гигабайты...
Заранее благодарен
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2016, 11:50     Поиск утечки памяти
Посмотрите здесь:

Утечки памяти и STL C++
подскажите пожалуйста, правильно ли сделанна конструкция, и не будет ли утечки памяти C++
Утечки памяти C++
Про утечки памяти C++
C++ утечки памяти - просто жесть
C++ Чтение памяти ( поиск функций )
Я создаю утечки памяти ! C++
Не будет ли утечки памяти? C++
C++ Утечки памяти при использовании new/delete для двумерных массивов
Определение утечки памяти C++
C++ Объяснить причины и способы устранения утечки памяти в деструкторе
Поиск текста в памяти игры C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Default_070
 Аватар для Default_070
23 / 23 / 10
Регистрация: 01.10.2015
Сообщений: 172
Завершенные тесты: 1
21.03.2016, 12:05     Поиск утечки памяти #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Думаю, все из-за циклов. К примеру в этом коде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for (int n = 1; n < N; n++)
        {
            for (int i = 0; i < N - 1; i++)
            {
                A[i] = -1.0;
                C[i] = -4.0;
                B[i] = -1.0;
 
                F[i] = (1.0 - omega)*(-u[i][n][0] + 4.0*u[i + 1][n][0] - u[i + 2][n][0]) + omega*(u[i + 1][n - 1][1] + u[i + 1][n + 1][0] - delta*delta*f_d(i + 1, n));
            }
            // может так?
            // if(Y)
            //    delete[]Y;
            Y = TriDiagSolve(A, B, C, F, N - 1); // присваивание Y адреса памяти, хотя ты не удаляешь предыдущий указатель
            
 
            for (int x = 1; x < N; x++)
                for (int y = 1; y < N; y++)
                    u[x][y][0] = u[x][y][1];
 
            for (int x = 1; x < N; x++)
                u[x][n][1] = Y[x - 1];
        }
proggamer12
17 / 17 / 2
Регистрация: 06.07.2012
Сообщений: 498
Завершенные тесты: 1
21.03.2016, 13:04  [ТС]     Поиск утечки памяти #3
Спасибо Вам! Крайне признателен за помощь!
Yandex
Объявления
21.03.2016, 13:04     Поиск утечки памяти
Ответ Создать тему
Опции темы

Текущее время: 17:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru