Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
2 / 2 / 0
Регистрация: 04.02.2013
Сообщений: 92

Что считать утечкой памяти?

20.06.2015, 16:05. Показов 3162. Ответов 65
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
class A
{
public:
    A() { cout << "create A" << endl; };
    ~A() { cout << "delete A" << endl; };
     void func(){ cout << "func A" << endl; };
 
private:
 
};
 
class B :public A
{
public:
    B() { cout << "create B" << endl; };
    ~B() { cout << "delete B" << endl; };
     void func(){ cout << "func B" << endl; };
 
private:
 
};
 
void main()
{
 
    A *a_ptr = new A;
    B b;
 
    a_ptr = &b;
 
    a_ptr->func();
}
 Комментарий модератора 

Выделил новую тему отсюда, т.к. оффтоп.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2015, 16:05
Ответы с готовыми решениями:

Как бороться с утечкой памяти?
Добрый день! у меня такая проблема: в моей программе видимо где-то проблемы с утечкой памяти. если много раз запустить - закрыть прогу,...

Не могу справиться с утечкой памяти TChromium
Добрый день Нужна помощь, пишу примитивный браузер на d2010 с использованием TChromium у меня жутко течет память... Пробовал на...

Как справиться с утечкой памяти в коде?
Есть вот такая форма internal partial class FindDialogForm&lt;T&gt; : XtraForm { public List&lt;T&gt; SelectedItems { get; private...

65
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 13:43
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Tulosba Посмотреть сообщение
Забить можно. Но это всё равно утечка. Что же ты непонятливый-то такой?
потому что это не утечка.

Кликните здесь для просмотра всего текста
Уте́чка па́мяти (англ. memory leak) — процесс неконтролируемого уменьшения объёма свободной оперативной или виртуальной памяти компьютера, связанный с ошибками в работающих программах, вовремя не освобождающих ненужные уже участки памяти, или с ошибками системных служб контроля памяти.
в данном случае все контролируемо, ожидаемо, предсказуемо, и безвредно.

можно много раз запускать хэлловорлд на выполнение.
и ни разу не возникнет ситуации,
когда приложение зажирает непойми какую память, не пойми куда.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
21.06.2015, 14:07
hoggy, Википедия не является авторитетным источником. Или назовите мне автора этого определения. А то оно стремное какое-то. То есть если я напишу демон, который вообще не будет освобождать память, и скажу, что он контролируемо сжирает всю память ОС за 2 часа, после чего я его рестарчу, то типа у меня в демоне утечек памяти нет? А может все-таки это говорит о том, что там дофига утечек, но просто я на них забил?

У нас в памяти есть объект, который оттуда нельзя удалить. Приложение само не освобождает память, в которой больше не нуждается для работы, а возлагает это на ОС. Поэтому в приложении - по определению это утечка. Осознанная или нет, допустимая или нет, - это уже другой вопрос.

Если мы пишем продакшен-код, то нужно спрашивать себя - "есть ли тут реальная причина не освобождать память"? Если причины нету, то освобождать. Обратные вопросы типа "а можно ли тут не освобождать память" - показатели непрофессионализма, до добра не доводящие.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 14:27
Цитата Сообщение от ct0r Посмотреть сообщение
если я напишу демон, который вообще не будет освобождать память, и скажу, что он контролируемо сжирает всю память ОС за 2 часа, после чего я его рестарчу, то типа у меня в демоне утечек памяти нет?
верно, при условии, что так изначально было задуманно.
и всех все устраивает.

если требования изменятся, и нужно будет, что бы демон 7/24 крутился без рестартов,
а он не может, потому что падает от нехватки памяти,
и хрен что с этим поделаешь, без серьёзного рефактора,
тогда это уже будет называться "утечки".


вот вам другой пример: есть специальные аппараты, и софтина под них.
требование к работе: утюг. воткнули в розетку - работает. выткнули - не работает.

в каких то частых циклах память освобождается,
как и должно быть по уму.

но долгоживущие объекты, аля "звуковая подсистема" создаются,
а на освобождение забивается.

зачем? время жизни - до конца приложения.
а выключение - дернуть шнур из розетки.

Цитата Сообщение от ct0r Посмотреть сообщение
Если мы пишем продакшен-код, то нужно спрашивать себя - "есть ли тут реальная причина не освобождать память"? Если причины нету, то освобождать. Обратные вопросы типа "а можно ли тут не освобождать память" - показатели непрофессионализма, до добра не доводящие.
верно.
однако, главный признак профессионализма - не делать то,
что можно было бы не делать.
то есть, не делать что-либо зазря.

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

мои софтинки это спокойно перенесли,
потому что я использовал смарт-поинтеры,
и вручную память нигде не дергал.
это к слову о продакшене.

а вот если кто нибудь докалебется до хэлловорлда из 5 строк кода:
так и хочется ответить: да идите в баню, оно вообще надо?
писать дополнительный код,
который не относится к иллюстрации момента,
и никому нафиг не нужен.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.06.2015, 14:44
Цитата Сообщение от hoggy Посмотреть сообщение
верно, при условии, что так изначально было задуманно.
и всех все устраивает.
Чушь несёшь полнейшую. По твоей логике получается:
* Демон жрет память, мы это знаем, поэтому перезапускаем его каждые пару часов и радуемся. Утечек нет.
* Забыли перезапустить демона вовремя - утечки есть.
Так?
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
21.06.2015, 14:59
Цитата Сообщение от hoggy Посмотреть сообщение
в данном случае все контролируемо, ожидаемо, предсказуемо, и безвредно.
Конечно для тебя это так , но это не справедливо для ТС . Поэтому для тех кто в курсе это не утечка, а для тех кто в танке да.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
21.06.2015, 15:18
hoggy, в статьях, документациях, инструментах обнаружения утечек, которые я видел, - везде это характеризуется как свойство именно кода, безотносительно каких-либо внешних требований. Можете привести ссылки какие-нибудь?

Цитата Сообщение от hoggy Посмотреть сообщение
а вот если кто нибудь докалебется до хэлловорлда из 5 строк кода:
так и хочется ответить: да идите в баню, оно вообще надо?
писать дополнительный код,
который не относится к иллюстрации момента,
и никому нафиг не нужен.
В целом тут вы правы, но фиг знает, может ТС был вообще не в курсе, что в программах надо освобождать память

Добавлено через 5 минут
Цитата Сообщение от hoggy Посмотреть сообщение
однако, главный признак профессионализма - не делать то,
что можно было бы не делать.
то есть, не делать что-либо зазря.
Еще более главный признак профессионализма - уметь понять, что именно зазря, а что нет
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 20:01
Цитата Сообщение от Tulosba Посмотреть сообщение
Чушь несёшь полнейшую. По твоей логике получается:
* Демон жрет память, мы это знаем, поэтому перезапускаем его каждые пару часов и радуемся. Утечек нет.
* Забыли перезапустить демона вовремя - утечки есть.
Так?
сам по себе такой пример - ёрничание, передёргивание ситуации.
потому что никто в здравом уме не будет сознательно
писать настолько запредельный б_ы_д_л_о_к_о_д.

но если бы нашелся настоящий ценитель:
забыл бы перезапустить демона - поимел бы аварию сервиса.
а не утечку.



я вам приведу более реалестичный пример:

допустим, есть некий движок для видео-игр:
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
class engine
{
    system::window* mWindow;
    system::graphic* mGraphic;
    system::gui*       mGui;
    system::sound*   mSound;
 
   // нас не интересует весь код, только схематично конструктор :
   ... 
public:
    engine()
        :mWindow(new system::window(FULLSCREEN))
        ,mGraphic( new system::graphic(OPENGL,  mWindow->getWnd() ))
        ,mGUI( new system::gui(mWindow->getWnd() ))
        ,mSound()
   {
        try{
            mSound = new system::sound;
        }
        catch(const std::exception& e)
        {
            system::log << 
                "звуковая подсистема не работает\n"
                "причина: " << e.what() << "\n"
                "реакция: играем без звука\n";
        }
   }
 
   ~engine() {
      // здесь корректная остановка всех подсистем, 
      // и их деактивация
   }
};
собственно вопрос: может ли здесь быть утечка?
заметьте: я не спрашиваю, есть ли тут утечка,
я спрашиваю: теоретически вообще может ли здесь быть утечка?

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

что с того, что у нас там не отработают диструкторы
отдельных полей класса в случае эксепшенов?

что с того, что часть памяти зачистит система, а не оператор delete ?

у нас в любом случае авария несовместимая с жизнью приложения.
мы все равно ничего не можем сделать.

ну поменяем мы сырые указатели на смартпоинтеры, ну позвали мы эти самые диструкторы.
что дальше?

в любом случае все, всё, что мы можем сделать в этой ситуации,
это заллогировать происшествие, и тихо помереть.

видео-игра без окна, без графики, без гуи функционировать все равно не сможет.

но для логгирования нам звать диструкторы не нужно.
мы это итак можем сделать.

и уже не важно кто зачистит за приложением: система, или диструкторы классов.
исход все равно один: это авария. а не утечка.

так что здесь есть только два варианта:
либо авария, и шандец всему.
либо все отлично, играем, наслаждаемся жизнью.

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

а без звуковой можно.
поэтому для неё персонально exception-safe



Добавлено через 8 минут
Цитата Сообщение от maxillion Посмотреть сообщение
Конечно для тебя это так , но это не справедливо для ТС . Поэтому для тех кто в курсе это не утечка, а для тех кто в танке да.
для тех кто в танке, утечки - это меньшее из их проблем.

Цитата Сообщение от ct0r Посмотреть сообщение
hoggy, в статьях, документациях, инструментах обнаружения утечек, которые я видел, - везде это характеризуется как свойство именно кода, безотносительно каких-либо внешних требований. Можете привести ссылки какие-нибудь?
могу только призвать к здравому смыслу.

вот вам очень простой способ:
вы сознательно выбросили объекты, или вы их потеряли?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 20:04
Ребят, а существует ли какое-то одно конкретное трактование понятия "утечка памяти"? Если да, тогда откуда растут корни?
А может быть всё намного проще, и каждый прав по-своему!?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 20:07
Цитата Сообщение от castaway Посмотреть сообщение
Если да, тогда откуда растут корни?
"неконтролируемая утеря ресурсов" жеж.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 20:17
Цитата Сообщение от hoggy Посмотреть сообщение
"неконтролируемая утеря ресурсов" жеж.
Ок. Уточним. Откуда растут корни этого выражения?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 20:27
Цитата Сообщение от castaway Посмотреть сообщение
Откуда растут корни этого выражения?
а хз, это что-то из области истории.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 20:31
Цитата Сообщение от hoggy Посмотреть сообщение
а хз, это что-то из области истории.
Ну вот. А теперь предлагаю сойтись на том что каждый по-своему прав, и не разводить холивар. Пусть каждый трактует это понятие полагаясь на собственные убеждения.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.06.2015, 22:17
Цитата Сообщение от castaway Посмотреть сообщение
Пусть каждый трактует это понятие полагаясь на собственные убеждения.
Ага. А потом договоримся до того, что один прав, когда 2+2=5, а другой - когда 2*2 = 6.

Определение утечки памяти - одно единственное: отсутствие возможности освободить память объекта, доступ к которому невозможен.
(Не знаю даже какой авторитетности должен быть источник, чтобы в это поверил наш неверующий Фома).

Считать утечки существенными или нет - совершенно другой разговор (то, что пытается впарить нам hoggy). Важность утечки никоим образом не отменяет факта существования самой утечки.

Если вдруг возникло какое-то сомнение - запусти профайлер, заточенный на поиск утечек и посмотри, что он будет говорить например для такого кода (с delete и без):
C++
1
2
3
4
int main() {
   int* p = new int;
   // delete p;
}
А говорить он будет (без delete), совершенно однозначно, что утечки есть, потому что ему безразлично важные они или нет (он не такой как hoggy).
Вариант вывода valgrind'а:
4 bytes in 1 blocks are definitely lost in loss record 1 of 1
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 22:21
Цитата Сообщение от Tulosba Посмотреть сообщение
Ага. А потом договоримся до того, что один прав, когда 2+2=5, а другой - когда 2*2 = 6.
Ну это ты уже немного перегнул
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 22:22
Цитата Сообщение от Tulosba Посмотреть сообщение
Определение утечки памяти - одно единственное: отсутствие возможности освободить память объекта, доступ к которому невозможен.
(Не знаю даже какой авторитетности должен быть источник, чтобы в это поверил наш неверующий Фома).
хотя бы один любой источник аля "виккипедия" приведите.
потому что везде пишут: неконтролируемая утеря ресурса.
0
21.06.2015, 22:23

Не по теме:

Tulosba, я что-то не понял, они всё-таки добавили кнопку "Выделить код", или я неосознанно скрипт установил?

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 22:24
Цитата Сообщение от Tulosba Посмотреть сообщение
Если вдруг возникло какое-то сомнение - запусти профайлер, заточенный на поиск утечек и посмотри, что он будет говорить например для такого кода (с delete и без):
запустил.
правда настроил так, что бы он не агрился на эту переменную.
и блин... молчит, зараза.

или вот: запилил сингелтон, который майн пережил - сагрилсо!

вот не нада вот такую туфту прогонять.

я аппелирую к здравому смыслу.

вы - к форме, не учитывая содержание.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.06.2015, 22:31
Цитата Сообщение от hoggy Посмотреть сообщение
неконтролируемая утеря ресурса.
Так а ты думаешь забытый вызов delete не есть неконтролируемая утеря ресурса?
Контроль подразумевает возможность что-то сделать (освободить память в данном случае), а возможности этой нет на уровне языка. И не надо тут про ОС повторять. ОС это уже другой уровень, которого, как я раньше говорил, может и вовсе не быть.

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Ну это ты уже немного перегнул
Лиха беда начало.

0
21.06.2015, 22:34

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
я что-то не понял, они всё-таки добавили кнопку "Выделить код", или я неосознанно скрипт установил?
А я уже хотел жаловаться на баг в скипте :D, у меня двойной вариант рисует:
Если включили, то это круто, и юзерскрипт я конечно тогда отключу.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.06.2015, 22:39
Цитата Сообщение от Tulosba Посмотреть сообщение
Так а ты думаешь забытый вызов delete не есть неконтролируемая утеря ресурса?
разумеется я так не думаю.
ключевое слово "забытый".

Цитата Сообщение от hoggy Посмотреть сообщение
вот вам очень простой способ:
вы сознательно выбросили объекты, или вы их потеряли?
Цитата Сообщение от Tulosba Посмотреть сообщение
Контроль подразумевает возможность что-то сделать
ага. и сделать это можно разными способами.

Цитата Сообщение от Tulosba Посмотреть сообщение
ОС это уже другой уровень, которого, как я раньше говорил, может и вовсе не быть.
вот если его нету - тогда это уже другой разговор.

обратите внимание:
Цитата Сообщение от ritmix10 Посмотреть сообщение
void main()
100% что это вижал студия, так что не нада тут ля ля.

и потом, на то оно и контролируемое, что программист в курсе.
так что даже если теоретически нужно будет портануться на какие нибудь микроволноффки - проблем не вызовет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2015, 22:39
Помогаю со студенческими работами здесь

Является ли данный случай утечкой памяти?
Имеется программа, написанная на языке СИ с использованием граф. библиотеки GTK+. Запуск и наблюдения проводились на ноутбуке с 4гб...

Когда исправят баг с утечкой памяти в Rhythmbox?
В Ubuntu 12.04 x64 есть утечка памяти в Rhythmbox, мегабайт на 1 песню примерно... Исправлен ли этот баг в 12.10 x64? Есть у кого...

Setjmp, longjmp, malloc - как бороться с утечкой памяти
Здравствуйте! Вот небольшой тестовый пример, в котором, как я понимаю, free(buf) никогда не выполнится. exit(...) борится только с...

Как бороться с утечкой памяти в приложении при его длительной работе
Всем доброго времени суток. Началось все с того, что после недельной бесперерывной работы программы у Датагрида справа на полосе...

Считать изображения из памяти
Новичок в андроиде Собственно задача состоит в том что бы считать из памяти телефона все хранящиеся там изображения и отобразить их в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru