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

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

Войти
Регистрация
Восстановить пароль
 
admsasha
19 / 19 / 4
Регистрация: 11.06.2011
Сообщений: 250
#1

Не чиститься память при разрушении класса - C++

08.02.2014, 08:04. Просмотров 235. Ответов 3
Метки нет (Все метки)

Сделал небольшой пример tcp сервера.
http://rusfolder.com/39763465

Он принимает строки, разделенные \n и пересылает их обратно. Если слать небольшими порциями пакеты, то всё работает нормально. Если я вышлю очень большую порцию пакета, например "test\ntest\ntest\n" и так. несколько тысяч, cервер заполняет массив writeBuffer данными и память раз растает до 100MB, это нормально и понятно. НО когда сессия завершается эта память не очищается. По выводу "~session" я увижу, что деструктор сработал, но все теже 100MB как были так и висят. valgrind никакой утечки памяти не показал. Если повторно подключиться и выслать такой же большой пакет, то память просумируется. И уже будет 200MB занятой памяти. Почему память не очищается при завершении session ? Массив writeBuffer должен очищаться при уничтожении session или я ошибаюсь ? Почему память разрастается, я понимаю, но почему не очищается нет...


Код примера тестирования.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  try {
        boost::asio::io_service io_service;
 
        tcp::socket s(io_service);
        tcp::resolver resolver(io_service);
        boost::asio::connect(s, resolver.resolve({"localhost", "1234"}));
 
        char request[max_length]="test\n";
        size_t request_length = std::strlen(request);
        char reply[max_length];
        std::string buffer="";
        for (int i=1;i<10000000;i++){
            boost::asio::write(s, boost::asio::buffer(request, request_length));
        }
 
    }catch (std::exception& e){
        std::cerr << "Exception: " << e.what() << "\n";
    }
OS: kernel 3.10.19
gcc версия 4.7.3 20121001
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2014, 08:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не чиститься память при разрушении класса (C++):

Как выделить память под динамические переменные при создании класса? - C++
В прошлой теме ответ получил, но не до конца. Вопрос такой, как выделить память под динамические переменные? Вот часть кода ...

Память класса - C++
у меня есть кусок программы, скажите пожалуйста могу ли я присвоить переменной state_ другое значение и почему комментарий про объединение...

Динамическая память и конструктор класса - C++
Подскажите, почему Marshroute *objects2 = new Marshroute(for_loop); компилятор ругается на (for_loop), если я хочу запустить конструктор не...

Как выделить память для класса - C++
Привет, я пишу библиотеку управления памятью. На данный момент я выделяю память вот так void * __cdecl MyAlloc(size_t size) { void *...

Как поместить в объявленную память переменную класса? - C++
Вот, например, создал я массив class_name *array = new class_name ; Как я могу теперь засунуть в массив какие-нибудь переменные класса,...

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

3
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.02.2014, 15:40 #2
Цитата Сообщение от admsasha Посмотреть сообщение
Почему память не очищается при завершении session ?
То, что память осталась занята процессом, это решение ОС. Т.к. если память уже была выделена однократно, есть вероятность, что она потребуется еще раз. Чтобы не гонять ее туда-сюда, она резервируется за процессом. Чтобы понять что конкретно происходит надо ознакомиться с реализацией менеджера памяти конкретной версии ОС.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.02.2014, 16:03 #3
покажите код серверной части чтоли. может у вас буфер живет вне сессии и при повторном коннекте
продолжает разрастаться.
0
admsasha
19 / 19 / 4
Регистрация: 11.06.2011
Сообщений: 250
09.02.2014, 16:34  [ТС] #4
DU, А разве я не приложил ссылку на полный код серверной части ?
0
09.02.2014, 16:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2014, 16:34
Привет! Вот еще темы с ответами:

Как выделить динамически память для данных класса - C++
Как выделить динамически память для данных класса ? class circle { double x,y,r; public:void In(); void Out(); ...

Как динамически выделить память для конструкторов класса? - C++
подскажите как динамически выделить память для конструкторов класса? class circle { double x,y,r; public: void...

Можно ли динамически выделить память под массив указателей, на объекты класса? - C++
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно сформулировать. Можно ли строчку VisualizationTools* VT; заменить...

Возможно ли корректно увеличить память для свойства класса, заданного указателем? - C++
Всем привет. Вопрос скорее &quot;из интереса&quot;, но меня он мучает! 1. Объект класса создан в куче (через new) 2. В классе есть свойство...


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

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

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