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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
proggamer12
17 / 17 / 2
Регистрация: 06.07.2012
Сообщений: 505
Завершенные тесты: 1
#1

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

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

Утечки памяти - C++
Здравствуйте, уважаемые господа. Недавно заметил через диспетчер задач, что в моей программе присутствуют утечки памяти. Кол-во...

Я создаю утечки памяти ! - C++
Нет, я не хочу похвастаться этим. Я любитель использовать быстрые решение для того чтобы реализовать алгоритм или проверить &quot;чтобы...

Утечки памяти и STL - C++
Имеется код: #include &lt;map&gt; #define _CRTDBG_MAP_ALLOC #include &lt;stdlib.h&gt; #include &lt;crtdbg.h&gt; using namespace...

Про утечки памяти - C++
Здравствуйте. Может кто-нибудь посоветовать статьи на тему борьбы с утечками памяти? Дело в том, что недавно начал писать на C++ с...

Не будет ли утечки памяти? - C++
Привет. Мне нужно очистить строку (массив символов) char str; делаю так str = '\0'; не будет ли это утечкой? P. S. думаю нет,...

Определение утечки памяти - C++
Здравствуйте! Имеется такая ситуации: к проекту подключается lib файл и создается класс наследуемый класс определенный в либе. Подскажите...

утечки памяти - просто жесть - C++
analysis *SP; // объявляем классы SP = new analysis(Edit1-&gt;Text); //загружаем данные SP = new analysis(Edit2-&gt;Text); //загружаем данные...

Объяснить причины и способы устранения утечки памяти в деструкторе - C++
Почему если убрать коммент с деструктора, что закомментирован выбивает ошибка: &quot;утечка памяти&quot;? #include &quot;cow.h&quot; int main() { Cow...

Утечки памяти при использовании new/delete для двумерных массивов - C++
Добрый день. Суть в том, что есть несколько функций, получающих на вход и возвращающих двумерные массивы. Реализация передачи массивов...

подскажите пожалуйста, правильно ли сделанна конструкция, и не будет ли утечки памяти - C++
vector&lt;int*&gt; mas; int* buf; for(int i=0;i&lt;10;i++) { buf=new int; mas.push_back(buf); } delete buf; for(int...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Сообщений: 505
Завершенные тесты: 1
21.03.2016, 13:04  [ТС]     Поиск утечки памяти #3
Спасибо Вам! Крайне признателен за помощь!
Ответ Создать тему
Опции темы

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