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

Потеря памяти в программе - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
23.10.2012, 20:07     Потеря памяти в программе #1
Подскажите пожалуйста, как отловить в каком месте происходит потеря памяти? Программа считает, но если открыть диспетчер задач, то файл подкачки растет до 2ГБ и программа перестает считать, а там внутри цикл, который должен работать долго.
-------------------------------
Приложен txt с кодом. Коду не пугаться =)
Вложения
Тип файла: txt Code.txt (9.6 Кб, 30 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.10.2012, 20:30     Потеря памяти в программе #2
Всю память, выделенную через new, надо чистить с помощью delete
Можно сделать себе вспомогательные макросы, которые считают, сколько раз был вызван new и сколько delete. От утечек это не спасет, но вы хотя бы будете в курсе
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
23.10.2012, 21:21  [ТС]     Потеря памяти в программе #3
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
double* direct_multiple(double angle1, double angle2)
{
    double* new_matrixS = new double[4];// пока что с двойкой, потом двойка будет входить в переменную для весов
    
    new_matrixS[0]=2*cos(angle1)*cos(angle2);
    new_matrixS[1]=2*cos(angle1)*sin(angle2);
    new_matrixS[2]=2*sin(angle1)*cos(angle2);
    new_matrixS[3]=2*sin(angle1)*sin(angle2);
    return new_matrixS;
}
 
 
 
double* funkg(double koord[],double mu, double lambda)//,double Z, double fi)
{
    
    double* g = new double[2];
    g[0] = /*1 + koord[0] - koord[0]*koord[1];//*/1 + pow(koord[0],2) - ((4*mu + 2*lambda)/(mu + lambda))*koord[0]*koord[1];
    g[1] = /*1 + koord[0] - koord[0]*koord[1];//*/1 + pow(koord[1],2) - ((4*mu + 2*lambda)/(mu + lambda))*koord[0]*koord[1];
    return g;
}
 
double* get_B(double alpha,double fi, double R, double Rc[], double Z, double y[])
{
    double thetta;
    thetta = atan2(y[1]-Rc[1],y[0]- Rc[0]);
    double* matr = new double[4];   
 
    double* Ef = new double[4];
    double* matrfi = new double[4];
    double* matrthfi = new double[4];
    
    Ef[0]=1;
    Ef[1]=0;
    Ef[2]=0;
    Ef[3]=1;
    
    double p0 = 0;
 
    p0 = (alpha*Z - R)/R;
 
    double a1; // случайная величина от 0 до 1 используется для вычисления матрицы B
    double a2; // случайная величина от 0 до 1 используется для вычисления матрицы B если a1 > alpha/(2+alpha)
 
    a1 = rand();
    a2 = rand();
 
    if (thetta < 0) {thetta = thetta + 2*pi;}
 
    matrfi = direct_multiple(fi,fi);
    matrthfi = direct_multiple((thetta + fi)/2,(thetta + fi)/2);
    
    if (a1 < alpha/(2+alpha))
    {
        matr = matrfi;
    }
    else if (2*R - alpha*Z > 0) 
    {
        if (a2 < (2*R - alpha*Z)/2*R)
        {
            matr = Ef;
        }
        else 
        {
            matr = matrthfi;
        }
    }
    else if (a2 < (alpha*Z - 2*R)/(2*R*p0))
    {
        matr[0] = -1*p0;
        matr[1] = 0;
        matr[2] = 0;
        matr[3] = -1*p0;
    }
    else
    {
        matr[0] = matrthfi[0]*p0;
        matr[1] = matrthfi[1]*p0;
        matr[2] = matrthfi[2]*p0;
        matr[3] = matrthfi[3]*p0;
    }
    //delete[] matrfi;
    //delete[] matrthfi;
    return matr;
}
Если раскомментить в конце delete, вылетает фатал еррор, хотя в другом месте подобный маневр работает
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 03:20     Потеря памяти в программе #4
В get_B() утечка памяти. Выделяете память под matrfi и matrthfi. После вызова функции direct_multiple() они указывают уже на память, выделенную в этой функции.
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 06:32  [ТС]     Потеря памяти в программе #5
На самом деле это было почти очевидно, потому что этот код отличается от предыдущего только этим куском. Только вот я не могу понять как удалять эту память. Если я раскомментирую delete[] у меня вылетает фатал еррор. Понятно, что я делаю что-то не так. Только вот что... Т.к. в другом месте подобное удаление работает а отличие от него, видимо, в силу своей неопытности я найти не могу =(
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
24.10.2012, 06:53     Потеря памяти в программе #6
Например, в функции tree есть утечка:
Сначала
C++
1
double* matrix = new double[4];
потом
C++
1
matrix = get_B(...);
без освобождения памяти, выделенной ранее.
В функции get_B тоже самое:
C++
1
2
3
double* matr = new double[4];
//...
matr = matrfi;
И еще в некоторых всех местах
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 09:09  [ТС]     Потеря памяти в программе #7
Вопрос как раз именно в том, как правильно бороться =) Этого я не знаю, пробовал способы, вылетаю фатал ерроры =(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 12:11     Потеря памяти в программе #8
Объясните логику вашего кода. В функции get_B() вам с какой нужно памятью работать: с той, что выделяется в этой функции, или с той, что выделяется в функции direct_multiple()? Тут проблема даже не в самих утечках памяти, а в нелогичном коде.

Добавлено через 5 минут
Почему фатал еррор вылетает не понятно, всего кода не видно. Но дело не в этом. Нужно код нормальный сделать, а не просто коменты ставить.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
24.10.2012, 16:38     Потеря памяти в программе #9
Цитата Сообщение от Default Посмотреть сообщение
Вопрос как раз именно в том, как правильно бороться =) Этого я не знаю, пробовал способы, вылетаю фатал ерроры =(
Почитайте в книжке как работать с динамической памятью.
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 17:02  [ТС]     Потеря памяти в программе #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Почитайте в книжке как работать с динамической памятью.
Можете ли вы подсказать название книжки?

Добавлено через 27 секунд
Цитата Сообщение от alsav22 Посмотреть сообщение
Объясните логику вашего кода. В функции get_B() вам с какой нужно памятью работать: с той, что выделяется в этой функции, или с той, что выделяется в функции direct_multiple()? Тут проблема даже не в самих утечках памяти, а в нелогичном коде.

Добавлено через 5 минут
Почему фатал еррор вылетает не понятно, всего кода не видно. Но дело не в этом. Нужно код нормальный сделать, а не просто коменты ставить.
Код приложен к первому посту =)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
24.10.2012, 17:08     Потеря памяти в программе #11
Цитата Сообщение от Default Посмотреть сообщение
Можете ли вы подсказать название книжки?
Как мне кажется, в любой книжке есть
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.10.2012, 17:10     Потеря памяти в программе #12
Цитата Сообщение от I.M. Посмотреть сообщение
Всю память, выделенную через new, надо чистить с помощью delete
Можно сделать себе вспомогательные макросы, которые считают, сколько раз был вызван new и сколько delete. От утечек это не спасет, но вы хотя бы будете в курсе
Утечек и так тонадо ещё постараться добиться.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 17:10     Потеря памяти в программе #13
Цитата Сообщение от Default Посмотреть сообщение
Код приложен к первому посту =)
Прошу прощения, пропустил.
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 17:13  [ТС]     Потеря памяти в программе #14
Никто конкретно подсказать не может, жаль, я сильно надеялся, пойду дальше самостоятельно рыть книжки и говорить с гуглом.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 17:26     Потеря памяти в программе #15
У вас, в первом посте, код один выложен, а дальше куски совсем уже другие. В коде из первого поста matrfi и matrthfi объявлены в глобальной области, и память там под них выделяется.

Добавлено через 53 секунды
Цитата Сообщение от Default Посмотреть сообщение
Никто конкретно подсказать не может
По какому коду подсказывать?
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 17:37  [ТС]     Потеря памяти в программе #16
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас, в первом посте, код один выложен, а дальше куски совсем уже другие. В коде из первого поста matrfi и matrthfi объявлены в глобальной области, и память там под них выделяется.

Добавлено через 53 секунды
По какому коду подсказывать?
Во второй кусок matrfi и matrthfi перемещены, чтобы было ясно, что это такое. Они только этим и отличаются. Собственно вопрос вокруг всего этого и крутится, где и как лучше выделить память и как избежать её утечки(излишнего накопления, что процесс не может далее продолжаться).
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
24.10.2012, 17:41     Потеря памяти в программе #17
Цитата Сообщение от Default Посмотреть сообщение
Никто конкретно подсказать не может, жаль, я сильно надеялся, пойду дальше самостоятельно рыть книжки и говорить с гуглом.
Судя по коду, Вы не внимательно читали книжки... либо совсем не читали, поэтому в Вашем коде утечки вообще на каждом шагу.

Цитата Сообщение от Default Посмотреть сообщение
Собственно вопрос вокруг всего этого и крутится, где и как лучше выделить память и как избежать её утечки
Освобождать память нужно тогда, когда она более не нужна и обнулять указатель.
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 17:46  [ТС]     Потеря памяти в программе #18
Каюсь, читал мало, кодю как умею. Какими командами это можно сделать? Я знаю delete[], но не совсем понимаю, как она работает...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 17:54     Потеря памяти в программе #19
Для начала. В main(), в цикле for(), при каждой итерации цикла, указателю z присваивается адрес новой памяти, выделенной в функции funkg(). Значит в конце итерации (после printf) эту память можно освобождать: delete [] z; Не решение проблемы, но для начала.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2012, 18:34     Потеря памяти в программе
Еще ссылки по теме:

C++ Можно ли изменить значение памяти в этой программе?
C++ Утечка памяти в программе
Потеря данных в string C++

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

Или воспользуйтесь поиском по форуму:
Default
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 18:34  [ТС]     Потеря памяти в программе #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Для начала. В main(), в цикле for(), при каждой итерации цикла, указателю z присваивается адрес новой памяти, выделенной в функции funkg(). Значит в конце итерации (после printf) эту память можно освобождать: delete [] z; Не решение проблемы, но для начала.
Как я догадываюсь основная проблема у меня в том, что когда я из функции get_B() вызываю функцию direct_multiple() у меня происходит накопление памяти. Как от него избавиться не ясно. Когда перед return прописываю delete[] matrfi и matrthfi, в которые я передаю direct_multiple() вылазит фатал, из-за чего конкретно и в чем косяк разобраться пока что не выходит.
Yandex
Объявления
24.10.2012, 18:34     Потеря памяти в программе
Ответ Создать тему
Опции темы

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