Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Vandelyst
0 / 0 / 0
Регистрация: 13.12.2016
Сообщений: 3
#1

Утечка памяти - C++

13.12.2016, 13:43. Просмотров 207. Ответов 5

Подскажите, где здесь может возникать утечка памяти? Вроде везде, где можно - чищу...
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/////////////////////////////////////
// It's realisation of 'LIFO' list //
/////////////////////////////////////
 
#include <iostream>
#include <string>
using namespace std;
 
/* THE ELEMENT OF LIST */
struct LIFO {
    int value, prefix_min;
    LIFO *next;
};
 
void Push(LIFO *&, int);    // Add the element at the top of the LIFO
int Pop(LIFO *&);           // DELETE and return the top of the LIFO
int Back(LIFO *);           // Return the top of the LIFO (not delete)
int Min(LIFO *);            // Return the minimum of elements from the LIFO
void Clear(LIFO *&);        // Clear the LIFO
 
int main() {
    int iternum, number, Fsize = 0;
    string command;
 
    LIFO *Stack = new LIFO;
    Stack->next = NULL;
    Stack->value = NULL;
    Stack->prefix_min = 1000000001;
 
    cin >> iternum;
    while (iternum-- > 0) {
        cin >> command;
        if (command == "push") {
            cin >> number;
            Push(Stack, number);
            Fsize++;
            cout << "ok\n";
        }
        else if (command == "pop") {
            if (Fsize) {
                cout << Pop(Stack) << endl;
                Fsize--;
            }
            else
                cout << "error\n";
        }
        else if (command == "back") {
            if (Fsize)
                cout << Back(Stack) << endl;
            else
                cout << "error\n";
        }
        else if (command == "min") {
            if (Fsize)
                cout << Min(Stack) << endl;
            else
                cout << "error\n";
        }
        else if (command == "size") {
            cout << Fsize << endl;
        }
        else if (command == "clear") {
            Clear(Stack);
            Fsize = 0;
            cout << "ok\n";
        }
        else
            cout << "error\n";
    }
    Clear(Stack);
    return 0;
}
 
void Push(LIFO *&Stack, int x) {
    int curr_min;
    if (x < Stack->prefix_min)
        curr_min = x;
    else
        curr_min = Stack->prefix_min;
    LIFO *Tmp = Stack;
    Stack = new LIFO;
    Stack->value = x;
    Stack->prefix_min = curr_min;
    Stack->next = Tmp;
}
 
int Pop(LIFO *&Stack) {
    int x = Stack->value;
    LIFO *Temp = Stack;
    Stack = Stack->next;
    delete Temp;
    return x;
}
 
int Back(LIFO *Stack) {
    return Stack->value;
}
 
int Min(LIFO *Stack) {
    return Stack->prefix_min;
}
 
void Clear(LIFO *&Stack) {
    while (Stack->next) {
        LIFO *Temp = Stack;
        Stack = Stack->next;
        delete Temp;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2016, 13:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Утечка памяти (C++):

Утечка памяти?
В Лафоре такой код: #include &lt;iostream&gt; using namespace std;...

утечка памяти
Может кто-то проверить есть ли здесь утечка памяти? Мне почему-то кажется что...

Утечка памяти?!
Джесс Либерти и Дэвид Хорват &quot;Освой самостоятельно С++ за 24 часа&quot;, вырезка из...

Утечка памяти
Не могу понять как избежать утечки памяти в своей программе... привожу кусок в...

Утечка памяти
Взял листинг кода из книги Стивен Прата Язык программирования С++. Меня...

Утечка памяти
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;ArrayOperation.h&quot; ...

5
John999
223 / 106 / 79
Регистрация: 17.10.2016
Сообщений: 312
13.12.2016, 15:33 #2
У вас prefix_min это поле узла ?
Почему?
ведь минимум ищите во всём стэке.

Back напрашивается назвать Top
(вершина стэка)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <string>
using namespace std;
 
/* THE ELEMENT OF LIST */
struct LIFO {
    int value;
    // int prefix_min;
    LIFO *next;
};
 
void Push(LIFO *&, int, int & pref_min);    // Add the element at the top of the LIFO
int Pop(LIFO *&);           // DELETE and return the top of the LIFO
int Back(LIFO *);           // Return the top of the LIFO (not delete)
//int Min(LIFO *);            // Return the minimum of elements from the LIFO
void Clear(LIFO *&);        // Clear the LIFO
 
int main() {
    int iternum, number, Fsize = 0;
    string command;
 
    LIFO *Stack = NULL;
 
    int prefix_min = 1000000001;
 
    cin >> iternum;
    while (iternum-- > 0) {
        cin >> command;
        if (command == "push") {
            cin >> number;
            Push(Stack, number, prefix_min);
            Fsize++;
            cout << "ok\n";
        }
        else if (command == "pop") {
            if (Fsize) {
                cout << Pop(Stack) << endl;
                Fsize--;
            }
            else
                cout << "error\n";
        }
        else if (command == "back") {
            if (Fsize)
                cout << Back(Stack) << endl;
            else
                cout << "error\n";
        }
        else if (command == "min") {
            if (Fsize)
                cout << prefix_min << endl;
            else
                cout << "error\n";
        }
        else if (command == "size") {
            cout << Fsize << endl;
        }
        else if (command == "clear") {
            Clear(Stack);
                        Stack = NULL;
            Fsize = 0;
            cout << "ok\n";
        }
        else
            cout << "error\n";
    }
    Clear(Stack);
        Stack = NULL;
    return 0;
}
 
void Push(LIFO *&Stack, int x, int  &  pref_min)
{
    if (x < pref_min)
        pref_min = x;
 
    LIFO *Tmp = new LIFO;
    Tmp->value = x;
    Tmp->next = NULL;
 
    if(Stack == NULL)
    Stack = Tmp;
    else
    {
        Stack->next = Tmp;
        Tmp = Stack;
    }
}
 
int Pop(LIFO *&Stack) {
    int x = Stack->value;
    LIFO *Temp = Stack;
    Stack = Stack->next;
    delete Temp;
    return x;
}
 
int Back(LIFO *Stack) {
    return Stack->value;
}
 
//int Min(LIFO *Stack) {
//  return Stack->prefix_min;
//}
 
void Clear(LIFO *&Head) {
    LIFO * Curr = Head;
    while (Curr) {
        LIFO *Temp = Curr->next;
        delete Curr;
        Curr = Temp;
        
    }
}
0
Vandelyst
0 / 0 / 0
Регистрация: 13.12.2016
Сообщений: 3
13.12.2016, 15:53  [ТС] #3
Цитата Сообщение от John999 Посмотреть сообщение
У вас prefix_min это поле узла ?
Почему?
ведь минимум ищите во всём стэке.
Да, но если не хранить префиксы, после каждого Pop'a придется пересчитывать минимум за линию, а так вывожу за единицу. Мне время дороже памяти

Цитата Сообщение от John999 Посмотреть сообщение
Back напрашивается назвать Top
(вершина стэка)
Что поделать, такие команды дает система.

Цитата Сообщение от John999 Посмотреть сообщение
LIFO *Tmp = new LIFO;
* * Tmp->value = x;
* * Tmp->next = NULL;
if(Stack == NULL)
* * Stack = Tmp;
* * else
* * {
* * * * Stack->next = Tmp;
* * * * Tmp = Stack;
* * }
Спасибо за фикс утечки! Пробую заливать
0
John999
223 / 106 / 79
Регистрация: 17.10.2016
Сообщений: 312
13.12.2016, 16:08 #4
хорошо. что там за минимум в задаче не понял
Цитата Сообщение от Vandelyst Посмотреть сообщение
Спасибо за фикс утечки!
Clear тоже у вас заменил
(Вдруг не заметили).
0
Vandelyst
0 / 0 / 0
Регистрация: 13.12.2016
Сообщений: 3
13.12.2016, 16:12  [ТС] #5
Цитата Сообщение от John999 Посмотреть сообщение
Clear тоже у вас заменил
(Вдруг не заметили).
Заменили по причине утечки?

C++
1
2
3
4
5
LIFO *Tmp = new LIFO;
    Tmp->value = x;
    Tmp->prefix_min = curr_min;
    Tmp->next = Stack;
    Stack = Tmp;
Next указывает в сторону головы, поэтому нужно вот так. Но утечки теперь вроде бы нет
0
John999
223 / 106 / 79
Регистрация: 17.10.2016
Сообщений: 312
13.12.2016, 16:38 #6
Цитата Сообщение от Vandelyst Посмотреть сообщение
Заменили по причине утечки?
Да.
0
13.12.2016, 16:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2016, 16:38
Привет! Вот еще темы с решениями:

Утечка памяти в
Кто подскажет плиз. Тут у меня утечка памяти foreach (var file in xpsFiles)...

Утечка памяти
Либо я себе мозг запудрила, либо помогите мне :) есть у меня вектор...

утечка памяти
доброго времени суток Уважаемые форумчане, помогите пожалуйста разобраться с...

Утечка памяти
Здравствуйте! Я пишу длинную арифметику для целых чисел. Ниже - функция...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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