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

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

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

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

08.02.2014, 08:04. Просмотров 217. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2014, 08:04     Не чиститься память при разрушении класса
Посмотрите здесь:

C++ Как выделить память для класса
C++ Память класса
C++ Можно ли записывать объекты класса string в память, чтоб потом их прочитать?
C++ Как выделить динамически память для данных класса
Динамическая память и конструктор класса C++
C++ Как динамически выделить память для конструкторов класса?
Деструктор класса. Как правильно очистить память? C++
C++ Как выделить память под динамические переменные при создании класса?
Удаление экземпляра класса в функции самого класса (Ошибка при отладке) C++
C++ Можно ли динамически выделить память под массив указателей, на объекты класса?
C++ Ошибка при вызове метода класса в методе другого класса
C++ Ошибка при работе с объектом класса в конструкторе другого класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.02.2014, 15:40     Не чиститься память при разрушении класса #2
Цитата Сообщение от admsasha Посмотреть сообщение
Почему память не очищается при завершении session ?
То, что память осталась занята процессом, это решение ОС. Т.к. если память уже была выделена однократно, есть вероятность, что она потребуется еще раз. Чтобы не гонять ее туда-сюда, она резервируется за процессом. Чтобы понять что конкретно происходит надо ознакомиться с реализацией менеджера памяти конкретной версии ОС.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.02.2014, 16:03     Не чиститься память при разрушении класса #3
покажите код серверной части чтоли. может у вас буфер живет вне сессии и при повторном коннекте
продолжает разрастаться.
admsasha
12 / 12 / 4
Регистрация: 11.06.2011
Сообщений: 210
09.02.2014, 16:34  [ТС]     Не чиститься память при разрушении класса #4
DU, А разве я не приложил ссылку на полный код серверной части ?
Yandex
Объявления
09.02.2014, 16:34     Не чиститься память при разрушении класса
Ответ Создать тему
Опции темы

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