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

Куда текёть память или чудеса в решете - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
REllanium
2 / 2 / 0
Регистрация: 22.07.2011
Сообщений: 9
25.08.2011, 18:53     Куда текёть память или чудеса в решете #1
Всем привет. Я начинаю верить в чудеса. Кто нибудь сможет доказать, что их не бывает?)))
Программка занимается периодическим (через каждые 10 секунд) опросом маршрутизатора по протоколу SNMP с помощью библиотеки net-snmp 5.5, при этом получая за каждую итерацию порядка 140 переменных от этого устройства. И вот идёт жуткая утечка памяти. 4 Мб за 18 минут!!! С помощью дебагера определил, что это происходит при обращении к функциям библиотеки netSNMP. (все вызовы функций согласно примеру с оф.сайта)
Поставил софтину под названием C++ Memory Validator, чтобы наконец поймать течь и залатать её!! То, что она показывает - это не передать словами, а только можно смотреть и дивиться (см вложение). Занятая память растёт, неосвобожденной памяти НУЛЬ!! и два нижний показателя тоже смотрите!!
Собстно, кто что скажет?? Хотя бы предположения - куда может деваться память??
Миниатюры
Куда текёть память или чудеса в решете  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
25.08.2011, 19:02     Куда текёть память или чудеса в решете #2
Цитата Сообщение от REllanium Посмотреть сообщение
Всем привет. Я начинаю верить в чудеса. Кто нибудь сможет доказать, что их не бывает?)))
Программка занимается периодическим (через каждые 10 секунд) опросом маршрутизатора по протоколу SNMP с помощью библиотеки net-snmp 5.5, при этом получая за каждую итерацию порядка 140 переменных от этого устройства. И вот идёт жуткая утечка памяти. 4 Мб за 18 минут!!! С помощью дебагера определил, что это происходит при обращении к функциям библиотеки netSNMP. (все вызовы функций согласно примеру с оф.сайта)
Поставил софтину под названием C++ Memory Validator, чтобы наконец поймать течь и залатать её!! То, что она показывает - это не передать словами, а только можно смотреть и дивиться (см вложение). Занятая память растёт, неосвобожденной памяти НУЛЬ!! и два нижний показателя тоже смотрите!!
Собстно, кто что скажет?? Хотя бы предположения - куда может деваться память??
Я сомневаюсь, что кто-то будет разбираться в вашей картинки. Нужен кто, где у вас происходит, как вы думаете, утечка памяти.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.08.2011, 19:19     Куда текёть память или чудеса в решете #3
Шо происходит таки, память без спросу тякёть...
Траааагедия...
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2011, 22:10     Куда текёть память или чудеса в решете #4
Цитата Сообщение от REllanium Посмотреть сообщение
Хотя бы предположения - куда может деваться память??
где-то в программе выделил, а освободить забыл, исходник надобно для анализа...
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.08.2011, 04:19     Куда текёть память или чудеса в решете #5
Цитата Сообщение от REllanium Посмотреть сообщение
Программка занимается периодическим (через каждые 10 секунд) опросом маршрутизатора по протоколу SNMP с помощью библиотеки net-snmp 5.5, при этом получая за каждую итерацию порядка 140 переменных от этого устройства.
Что с этими переменными дальше происходит?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,047
26.08.2011, 04:43     Куда текёть память или чудеса в решете #6
Цитата Сообщение от REllanium Посмотреть сообщение
Я начинаю верить в чудеса.
Я тоже
Цитата Сообщение от REllanium Посмотреть сообщение
Хотя бы предположения - куда может деваться память??
веришь в телепатию

Добавлено через 2 минуты
Цитата Сообщение от REllanium Посмотреть сообщение
Хотя бы предположения - куда может деваться память??
-что произошло с подводной лодкой?
_Она утонула (с)
REllanium
2 / 2 / 0
Регистрация: 22.07.2011
Сообщений: 9
26.08.2011, 12:03  [ТС]     Куда текёть память или чудеса в решете #7
Хааа!! Поднял лодку!!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void port_reports::updateAll() // обновляет все открытые итемы
{//срабатывает по таймеру=============== либо по кнопке "обновить"
 
    //бежим по ТопЛевелИтемам и смотрим.. если она открыта, то обновляем ее детей
    QTreeWidgetItemIterator it(ui.treeWidget);
    while (*it)
    {
        if ((*it)->isExpanded ()) //если устройство раскрыто в дереве
        {
                 //==============Не удалялись указатели============         
            QList<QTreeWidgetItem *> list=(*it)-> takeChildren (); //удаляем детей
            list.clear(); 
//======================================================
 
            ((DevItem*)(*it))->updateDevItem();//создаем детей
                
        }
        ++it;
    }
    timer->setInterval(ui.spinBox_7->value()*1000);
}
в итоге сделал так и не тякёть больше!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void port_reports::updateAll() // обновляет все открытые итемы
{//срабатывает по таймеру=============== либо по кнопке "обновить"
 
    //бежим по ТопЛевелИтемам и смотрим.. если она открыта, то обновляем ее детей
    QTreeWidgetItemIterator it(ui.treeWidget);
    while (*it)
    {
        if ((*it)->isExpanded ()) //если устройство раскрыто в дереве
        {
            
            DevItem * item = new DevItem(((DevItem*)(*it))->name,((DevItem*)(*it))->ip,((DevItem*)(*it))->community);
            int itemIndex = ui.treeWidget->indexOfTopLevelItem((*it));
            delete (*it);
            
            ui.treeWidget->insertTopLevelItem(itemIndex,item);
            item->updateDevItem();
            item->setExpanded(true);
        }
        ++it;
    }
    timer->setInterval(ui.spinBox_7->value()*1000);
}
Чудес и правда не бывает?? А как же дедушка мороз???
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.08.2011, 12:35     Куда текёть память или чудеса в решете #8
Цитата Сообщение от REllanium Посмотреть сообщение
QList<QTreeWidgetItem *> list=(*it)-> takeChildren (); //удаляем детей
list.clear();
Неа, не удаляем.

Цитата Сообщение от REllanium Посмотреть сообщение
DevItem * item = new DevItem
Тут возможно опять потечет...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2011, 13:05     Куда текёть память или чудеса в решете
Еще ссылки по теме:

Какие задания бывают на соревнованиях по программированию или куда стремиться новичку? C++
C++ Куда утекает память
"Чудеса типа float" или "Куда девалась информация?" C++

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

Или воспользуйтесь поиском по форуму:
REllanium
2 / 2 / 0
Регистрация: 22.07.2011
Сообщений: 9
26.08.2011, 13:05  [ТС]     Куда текёть память или чудеса в решете #9
Цитата Сообщение от fasked Посмотреть сообщение
Неа, не удаляем.


Тут возможно опять потечет...
не должно.. DevItem * item при срабатывании ИФа станет уже (*it) и почикается

Не понятно почему C++ Memory Validator на графике выдал, что нет unfreed памяти, а на других графиках, что всё чистится, но при этом используемая память росла
Yandex
Объявления
26.08.2011, 13:05     Куда текёть память или чудеса в решете
Ответ Создать тему
Опции темы

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