Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
1

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

23.10.2012, 20:07. Показов 2775. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста, как отловить в каком месте происходит потеря памяти? Программа считает, но если открыть диспетчер задач, то файл подкачки растет до 2ГБ и программа перестает считать, а там внутри цикл, который должен работать долго.
-------------------------------
Приложен txt с кодом. Коду не пугаться =)
Вложения
Тип файла: txt Code.txt (9.6 Кб, 33 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2012, 20:07
Ответы с готовыми решениями:

Потеря памяти
Здравия желаю!:) Вопрос: Возможна ли такая конструкция? #include<iostream> #include<conio.h>...

Потеря памяти
В универе дали примитивную задачку: возведение числа в степень. Система тестов у нас на git'e, все...

Потеря памяти на оперативке
Друзья! Обращаюсь к вам с проблемой не покидающей меня последние три дня! Кратко суть...

Повторная потеря оперативной памяти
Здравствуйте! Начну с начала. Около 4-5 лет назад собрал комп. Проблем особых не было, как помню....

28
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
23.10.2012, 20:30 2
Всю память, выделенную через new, надо чистить с помощью delete
Можно сделать себе вспомогательные макросы, которые считают, сколько раз был вызван new и сколько delete. От утечек это не спасет, но вы хотя бы будете в курсе
0
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, вылетает фатал еррор, хотя в другом месте подобный маневр работает
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 03:20 4
В get_B() утечка памяти. Выделяете память под matrfi и matrthfi. После вызова функции direct_multiple() они указывают уже на память, выделенную в этой функции.
0
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 06:32  [ТС] 5
На самом деле это было почти очевидно, потому что этот код отличается от предыдущего только этим куском. Только вот я не могу понять как удалять эту память. Если я раскомментирую delete[] у меня вылетает фатал еррор. Понятно, что я делаю что-то не так. Только вот что... Т.к. в другом месте подобное удаление работает а отличие от него, видимо, в силу своей неопытности я найти не могу =(
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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;
И еще в некоторых всех местах
0
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 09:09  [ТС] 7
Вопрос как раз именно в том, как правильно бороться =) Этого я не знаю, пробовал способы, вылетаю фатал ерроры =(
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 12:11 8
Объясните логику вашего кода. В функции get_B() вам с какой нужно памятью работать: с той, что выделяется в этой функции, или с той, что выделяется в функции direct_multiple()? Тут проблема даже не в самих утечках памяти, а в нелогичном коде.

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

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

Добавлено через 5 минут
Почему фатал еррор вылетает не понятно, всего кода не видно. Но дело не в этом. Нужно код нормальный сделать, а не просто коменты ставить.
Код приложен к первому посту =)
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
24.10.2012, 17:08 11
Цитата Сообщение от Default Посмотреть сообщение
Можете ли вы подсказать название книжки?
Как мне кажется, в любой книжке есть
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.10.2012, 17:10 12
Цитата Сообщение от I.M. Посмотреть сообщение
Всю память, выделенную через new, надо чистить с помощью delete
Можно сделать себе вспомогательные макросы, которые считают, сколько раз был вызван new и сколько delete. От утечек это не спасет, но вы хотя бы будете в курсе
Утечек и так тонадо ещё постараться добиться.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 17:10 13
Цитата Сообщение от Default Посмотреть сообщение
Код приложен к первому посту =)
Прошу прощения, пропустил.
0
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 17:13  [ТС] 14
Никто конкретно подсказать не может, жаль, я сильно надеялся, пойду дальше самостоятельно рыть книжки и говорить с гуглом.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 17:26 15
У вас, в первом посте, код один выложен, а дальше куски совсем уже другие. В коде из первого поста matrfi и matrthfi объявлены в глобальной области, и память там под них выделяется.

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

Добавлено через 53 секунды
По какому коду подсказывать?
Во второй кусок matrfi и matrthfi перемещены, чтобы было ясно, что это такое. Они только этим и отличаются. Собственно вопрос вокруг всего этого и крутится, где и как лучше выделить память и как избежать её утечки(излишнего накопления, что процесс не может далее продолжаться).
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
24.10.2012, 17:41 17
Цитата Сообщение от Default Посмотреть сообщение
Никто конкретно подсказать не может, жаль, я сильно надеялся, пойду дальше самостоятельно рыть книжки и говорить с гуглом.
Судя по коду, Вы не внимательно читали книжки... либо совсем не читали, поэтому в Вашем коде утечки вообще на каждом шагу.

Цитата Сообщение от Default Посмотреть сообщение
Собственно вопрос вокруг всего этого и крутится, где и как лучше выделить память и как избежать её утечки
Освобождать память нужно тогда, когда она более не нужна и обнулять указатель.
0
0 / 0 / 0
Регистрация: 08.04.2012
Сообщений: 28
24.10.2012, 17:46  [ТС] 18
Каюсь, читал мало, кодю как умею. Какими командами это можно сделать? Я знаю delete[], но не совсем понимаю, как она работает...
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 17:54 19
Для начала. В main(), в цикле for(), при каждой итерации цикла, указателю z присваивается адрес новой памяти, выделенной в функции funkg(). Значит в конце итерации (после printf) эту память можно освобождать: delete [] z; Не решение проблемы, но для начала.
1
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() вылазит фатал, из-за чего конкретно и в чем косяк разобраться пока что не выходит.
0
24.10.2012, 18:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2012, 18:34
Помогаю со студенческими работами здесь

Генерация сигнатуры файла. Потеря памяти
Нужно написать программу, которая будет генерировать сигнатуру. Файл делим на заданные блоки и их...

Backdoor и потеря памяти на системном диске
Собственно недавно словил BackDoor.Pushnik.21, Dr.Web его благополучно обноружил,но я нажал удалить...

Утечка памяти в программе
Есть приложение с ооочень странным поведением. Написали скрипт, который просто вычитывает VmSize и...

Утечка памяти в программе
Не могу понять, почему идет утечка памяти. Вот : Dumping objects -&gt;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru