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

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

Войти
Регистрация
Восстановить пароль
 
Я-Лис
29 / 64 / 13
Регистрация: 10.05.2011
Сообщений: 173
#1

Есть ли утечка памяти? - C++

28.04.2012, 12:16. Просмотров 666. Ответов 11
Метки нет (Все метки)

Пример добавления элемента в список.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 // Включение в список нового компонента
void comp_in(dyn_list &l, char* n, char* v)
{
    comp* c = new comp();
    strcpy_s(c->name, 20, n);
    strcpy_s(c->value, 10, v);
    c->next = NULL;
    if (chk_empty(l))
        l.head = c;
    else
        l.tail->next = c;
    l.tail = c;
}
Будет ли утечка памяти, если я не уничтожаю переменную c вручную? Или она автоматически уничтожится при выходе из функции?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2012, 12:16     Есть ли утечка памяти?
Посмотрите здесь:

C++ Утечка памяти
Утечка памяти C++
Есть ли утечка памяти в этом случае? C++
Утечка памяти C++
Утечка памяти C++
C++ Утечка памяти
Есть ли утечка памяти в list C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
87 / 739 / 75
Регистрация: 11.04.2012
Сообщений: 971
28.04.2012, 12:21     Есть ли утечка памяти? #2
Если каждый объект c не удалять вручную, то все они будут моментально разрушены после
окончания выполнения программы. Утечки памяти НЕ будет (см. ниже).
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,341
28.04.2012, 12:23     Есть ли утечка памяти? #3
В данном фрагменте кода - НЕ будет.
Я-Лис
29 / 64 / 13
Регистрация: 10.05.2011
Сообщений: 173
28.04.2012, 12:40  [ТС]     Есть ли утечка памяти? #4
А если программа еще не завершается? Т.е. если я несколько раз вызову функцию, а программу я не завершаю, я так понял у меня каждый раз будет выделяться новая переменная с и все они останутся висеть в памяти (пока не завершу программу), так или нет?
zitxbit
Master C/C++
87 / 739 / 75
Регистрация: 11.04.2012
Сообщений: 971
28.04.2012, 12:41     Есть ли утечка памяти? #5
ДАААААААА!!!!!!, конечно!
Я-Лис
29 / 64 / 13
Регистрация: 10.05.2011
Сообщений: 173
28.04.2012, 12:43  [ТС]     Есть ли утечка памяти? #6
zitxbit, =). Значит будем удалять.
zitxbit
Master C/C++
87 / 739 / 75
Регистрация: 11.04.2012
Сообщений: 971
28.04.2012, 12:48     Есть ли утечка памяти? #7
А вот при удалении указателей при помощи напр., delete[] с, может возникнуть утечка памяти.
Хотя в д.с. это мало вероятно, поскольку удаляется не указатель с нач. адресом буфера, а
объект класса. Также я бы порекомендовал создать для класса Comp деструктор, который
будет вызываться моментально после delete c, в нем и реализовать "уборщик мусора" для
объекта с которого требуется удалить.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
28.04.2012, 12:50     Есть ли утечка памяти? #8
Здесь c удалять нельзя. Программа перестанет работать.
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
28.04.2012, 12:52     Есть ли утечка памяти? #9
А что вы называете утечкой памяти? Давайте определимся. У Вас есть список указателей на структуры типа comp (переменная dyn_list). Вы динамически создаете структуру типа comp - то есть под нее операцией new выделяете память. До тех пор, пока Вы не сделаете delete для динамически созданной переменной типа comp, она будет занимать память. Память будет занята вне зависимости от того, в какой функции произошел вызов функции new. Автоматически ничего не очистится, операция delete сама собой не вызовется! При выходе из программы - другое дело, кончено, там освободится все
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.04.2012, 12:55     Есть ли утечка памяти? #10
Цитата Сообщение от Я-Лис Посмотреть сообщение
Пример добавления элемента в список.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 // Включение в список нового компонента
void comp_in(dyn_list &l, char* n, char* v)
{
    comp* c = new comp();
    strcpy_s(c->name, 20, n);
    strcpy_s(c->value, 10, v);
    c->next = NULL;
    if (chk_empty(l))
        l.head = c;
    else
        l.tail->next = c;
    l.tail = c;
}
Будет ли утечка памяти, если я не уничтожаю переменную c вручную? Или она автоматически уничтожится при выходе из функции?
при выходе из функции изчезнет только pointer c, который располагается в стеке. а объект останется жить в heap, где ему была выделена память. логично удалить объекты, на которые указывают элементы списка dyn_list в деструкторе dyn_list.
конечно, если логика программы не требует, чтобы они (или некоторые из них) жили дальше.
Я-Лис
29 / 64 / 13
Регистрация: 10.05.2011
Сообщений: 173
28.04.2012, 13:06  [ТС]     Есть ли утечка памяти? #11
andy_111, это я и имел ввиду.

ForEveR, не понял, почему перестанет работать.

Добавлено через 1 минуту
Просто я список сделал не через класс, а через структуру.

Добавлено через 4 минуты
Ааааа, кажется понял. Я тупанул, действительно нельзя удалять.

Добавлено через 4 минуты
Объекты они же мне еще пригодятся.=)
В начале просто возник вопрос именно в том будут ли уничтожаться динамические переменные при выходе из функции (или блока).

А удалять не надо, т.к. мне еще с ними работать. Что -то я ступил.

Всем спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2012, 13:07     Есть ли утечка памяти?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
28.04.2012, 13:07     Есть ли утечка памяти? #12
Я-Лис, И что? Отличий в С++ структуры от класса практически нет. Деструктор в структуре и не париться.
Yandex
Объявления
28.04.2012, 13:07     Есть ли утечка памяти?
Ответ Создать тему
Опции темы

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