Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > сколько памяти выделено виндой под программу?


Автор: victor79 15.8.2009, 19:56
как программно узнать, сколько памяти выделила винда под программу? Проблема в том, что встроенный счетчик выделений (все выделения происходят через mymalloc и myfree) показывает в несколько раз меньше выделенной памяти чем отображается в диспетчере задач.

Автор: GremlinProg 15.8.2009, 23:58
Цитата(victor79 @  15.8.2009,  21:56 Найти цитируемый пост)
Проблема в том, что встроенный счетчик выделений (все выделения происходят через mymalloc и myfree) показывает в несколько раз меньше выделенной памяти чем отображается в диспетчере задач.

по ходу, сразу возникает несколько вопросов:
- о каком виде памяти идет речь (физической или виртуальной),
- что делают mymalloc и myfree,
- и где этот встроенный счетчик выделений (в диспетчере задач счетчик не один)

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

если для виртуальной памяти эту меру можно зафиксировать (использовать 1 поток, либо синхронизацию), то для физической это практически нереально, т.к. она одна на всех, поэтому любой "чих" оси будет влиять на результат этой функции

Автор: victor79 16.8.2009, 01:14
mymalloc и myfree в упращенном варианте так

Код

int szalloced = 0;
void* mymalloc(int sz)
{
    szalloced += sz;
    int* p = (int*)malloc(sz+sizeof(int))
    p[0] = sz;
    return p+1;
}

void myfree(void* p)
{
    int *v = (int*)p;
    szalloced -= v[-1];
    free(v-1);
}


в свою очередь malloc наверняка вызывает какой-нить VirtualAlloc, т.е. выделяет память через операционку, т.е. у операционки где-то хранится, какие куски памяти и сколько ее выделено под процесс (иначе она не могла бы ее освобождать при завершении процессов, в том числе аварийных). Вопрос: как узнать сколько памяти выделено под процесс, объем той самой памяти, которую операционка высвободит если в тек момент завершить программу. Причем в независимости, где эта память располагается, в физической памяти, или в своп файле.

Автор: 586 16.8.2009, 03:55
Смотри в msdn описание функции GetProcessMemoryInfo.

Автор: victor79 17.8.2009, 08:37
спасибо, утечку памяти нашел - было некорректное использование VirtualAlloc.

Автор: GremlinProg 17.8.2009, 11:54
Цитата(victor79 @  17.8.2009,  10:37 Найти цитируемый пост)
было некорректное использование VirtualAlloc

и в чем это выражается?
ни одного упоминания VirtualAlloc в твоем коде я не вижу

Автор: Earnest 18.8.2009, 07:08
Вообще-то malloc стандартно берет память из глобального хипа процесса, и только последний уже где-то внутри АПИ выделяется через VirtualAlloc. Кроме того, не стоит забывать, что и стек и сам образ программы тоже занимают память, что отражается в диспетчере задач. По всей памяти процесса можно пройти с помощью вызовов VirttualQuery, которые расскажут что где лежит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)