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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти рекурсивно сумму ряда http://www.cyberforum.ru/cpp-beginners/thread1690520.html
e^(-x^2) = сумма, где k от 0 до бесконечности (-1)^k * (x^2*k)/k! x от 1 до 15 Пользуйтесь редактором формул внизу страницы {e}^{{-x}^{2}}=\sum_{k=0}^{\propto }\frac{{-1}^{k}{x}^{2k}}{k!}
C++ Найти в динамической матрице первую строчку, все элементы которой равны нулю Найти в матрице первую строчку, все элементы которой равны нулю.Все элементы столбика с таким же номер уменьшить в два раза. http://www.cyberforum.ru/cpp-beginners/thread1690505.html
Удаление последнего символа в массиве char C++
Здравствуйте, создаю массив chat Text; GetWindowText(GetDlgItem(hTab, id), Text, 200); strcat(Text, "*"); WritePrivateProfileString(tab, name, Text, "./MiminiBinderTabs.cfg"); и...
C++ Массив пикселей в изображение
В общем имеется камера с подключением по USB, а так же некоторая библиотека для работы с ней и исходник примера работы с библиотекой. #include <Windows.h> #include "InterfacesCore\IEnvironment.h"...
C++ Найти количество строк которые имеют хотябы 1 элемент равный 0 в матрице http://www.cyberforum.ru/cpp-beginners/thread1690474.html
Дна целочисленная матрица M×N *Найти количество строк которые имеют хотябы 1 элемент равный 0 *номер столбца в котором находится самая длинная серия одинаковых элементов.
C++ Найдите конъюнкцию, дизъюнкцию и исключающее или всех элементов массива Кому не составит труда, создайте, пожалуйста, массив из 10 элементов типа bool. Найдите конъюнкцию (&), дизъюнкцию (|)и исключающее или (^)всех его элементов. подробнее

Показать сообщение отдельно
proggamer12
17 / 17 / 2
Регистрация: 06.07.2012
Сообщений: 509
Завершенные тесты: 1

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

21.03.2016, 11:50. Просмотров 152. Ответов 2
Метки (Все метки)

Здравствуйте!
Не могли бы вы помочь мне найти утечку памяти в программе? Весь день искал, все вроде бы удаляется, но 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) утекают гигабайты...
Заранее благодарен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru