0 / 0 / 0
Регистрация: 13.12.2016
Сообщений: 3
1

Утечка памяти

13.12.2016, 13:43. Показов 490. Ответов 5

Author24 — интернет-сервис помощи студентам
Подскажите, где здесь может возникать утечка памяти? Вроде везде, где можно - чищу...
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2016, 13:43
Ответы с готовыми решениями:

Утечка памяти
Помогите с кодом, вот написал реализацию стека по заданию. Преподаватель попросил проверить, верно...

Утечка памяти
Либо я себе мозг запудрила, либо помогите мне :) есть у меня вектор vector&lt;char*&gt; names_variable;...

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

Утечка памяти
Где я допустил ее(утечку)? #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include...

5
230 / 113 / 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
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
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
13.12.2016, 16:08 4
хорошо. что там за минимум в задаче не понял
Цитата Сообщение от Vandelyst Посмотреть сообщение
Спасибо за фикс утечки!
Clear тоже у вас заменил
(Вдруг не заметили).
0
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
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
13.12.2016, 16:38 6
Цитата Сообщение от Vandelyst Посмотреть сообщение
Заменили по причине утечки?
Да.
0
13.12.2016, 16:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2016, 16:38
Помогаю со студенческими работами здесь

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

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

Утечка памяти
Здравствуйте! Возникает проблема при очистке дин.памяти. Помогите, найти ошибку((( ............

Утечка памяти
Првиетствую, помогите пожалуйста! Делаю бота для игры в вк. Но с каждым проходом внешнего цикла...


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

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

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