STL забирает память и не отдает...
От: Krovosos  
Дата: 03.09.09 20:22
Оценка: :)
MS Windows Vista

MS Visual Studio 2008 Express Edition

Проект:


#include <deque>
#include <list>
#include <string>
#include <queue>
#include "stdio.h"
#include "conio.h"
#include "windows.h"
using namespace std;


struct Message
{
    Message(const string& a, const string& b): A(a), B(b){}
    string A,B;
};



int main(int argc, char* argv[])
{
    int STRING_SIZE = 1000;

    int TOTAL = 1000000;

    int N = 1000;

    if (argc > 1) N = atoi(argv[1]);
    if (argc > 2) STRING_SIZE = atoi(argv[2]);

    queue<Message*> z;

    int k = 1;

    printf("Portion size: %d, string size: %d, press ENTER to start\n", N, STRING_SIZE);    getch();


    string A(STRING_SIZE , '0');
    string B(STRING_SIZE  + STRING_SIZE , '1');

    unsigned t = GetTickCount();

    while (TOTAL > 0)
    {
        for (int i = 0; i < N; i++)
            z.push(new Message(A,B));

        while (!z.empty())
        {
            delete z.front();
            z.pop();
        }

        printf("%d ", k);
        k++;
        TOTAL -= N;
    }




    printf("  done in %d ms", GetTickCount() - t); getch();

}


Идея очень проста — необходимо прокачать через очередь (STL queue) один миллион (TOTAL) неких сообщений (Message).
В queue мы храним только указатель (Message*). Новые объекты Message создаются и заносятся в очередь порциями.
Размер порции: N. То бишь заносим N новых сообщений, полностью выбираем их и уничтожаем и опять.

Подчеркиваю — после окончания прокачки сообщений ни одно сообщение не сохраняется — все уничтожены! То есть по идее мы должны выйти на то кол-во памяти, что было при запуске (ну ладно, пускай немного больше).


Итак, проблема: чем больше порция данных, тем больше памяти остается "не у дел" и не возвращается системе после окончания прокачки сообщений. Причем мне лично непонятно — кто и зачем взял эту память и не отдает. Ведь это явно не утечка, а какое-то внутреннее выделение под какие-то нужды.


Чтобы смотреть сколько памяти занято программой я использую Process Explorer от SysInternals. Открываем процесс, выбираем вкладку Performance Graph и смотрим Private Bytes.

Итак, запускаем программу вначале с порцией в тысячу сообщений:

queue.exe 1000

Сразу после запуска видимо, что занято 348 Kb. Жмем Enter и ждем окончания прокачки. Смотрим и видим, что теперь Private Bytes равно 3.7 Mb

Теперь порция в 10000:

queue.exe 10000

После окончания процесс занимает 24.5 Mb памяти!

Ну и дальше, как вы уже догадались, все хужее и хужее:

queue.exe 100000 — 68.7 Mb!!

Ну и наконец:

queue.exe 250000 — 156 Mb!!!

Шедевр! Кто бы мне объяснил — что происходит?

Я могу понять, что STL внутри себя выделяет память. Я не могу понять — почему эта память обратно не вернулась??


stl queue память проблемы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.