Проблема с менеджером кучи
От: CO6SENYA  
Дата: 15.12.06 17:31
Оценка:
Здравствуйте, Ребята.
У меня такая проблема..... Пишу программу, в которой реализуется сделаный мною менеджер кучи. Создаю кучу размером 100, а пытаюсь выделить память размером 500*sizeof(int). Но HeapAlloc не возвращает NULL, а выделяет память. В чём дело ? Вот листинг проги.
#include<stdio.h>
#include<windows.h>
#include<malloc.h>    
void* operator new(size_t size,HANDLE k)
{
    puts("Run");
    void *p;
    if(k==NULL)
    {
        k=HeapCreate(0,0,100);
    }

    if((p=HeapAlloc(k,HEAP_ZERO_MEMORY,size))!=NULL)
    {
        puts("Pamyat videlena");
        printf("%d\n",HeapSize(k,0,p));
        return (p);
    }
    else
    {
        puts("Memory not run");
        return NULL;
    }
}
void main()
{
    int n;
    HANDLE k=NULL;
    n=0;
    int *x;
    x=(int*)operator new(500*sizeof(int),k);
}

помоги, плз.
заранее спасибо.

18.12.06 12:37: Перенесено модератором из 'Коллеги, улыбнитесь'. И добавлено форматирование. — Кодт
Re: Проблема с менеджером кучи
От: _alm_ Украина  
Дата: 15.12.06 17:48
Оценка:
Здравствуйте, CO6SENYA, Вы писали:

COS>Здравствуйте, Ребята.

COS>У меня такая проблема..... Пишу программу, в которой реализуется сделаный мною менеджер кучи. Создаю кучу размером 100, а пытаюсь выделить память размером 500*sizeof(int). Но HeapAlloc не возвращает NULL, а выделяет память. В чём дело ? Вот листинг проги.
COS>void* operator new(size_t size,HANDLE k)
COS>{
COS>    puts("Run");
COS>    void *p;
COS>    if(k==NULL)
COS>    {
COS>        k=HeapCreate(0,0,100);
COS>    }

COS>    x=(int*)operator new(500*sizeof(int),k);


COS>помоги, плз.


Хип оперирует страницами, а не байтами. Объем страницы, насколько помню — 4096 байт. Ты ограничил размер хипа от 0 до 100 байтов — 1 страница. 500 интов — это 2000 байт. Так что никакой мистики.
Попробуй выделить память для 2000 интов. Сам проверить не могу — я ща под БСД вижу.

ЗЫ. А ваще — баян.
Re: Проблема с менеджером кучи
От: Lloyd Россия  
Дата: 15.12.06 17:59
Оценка: 1 (1) +4
Здравствуйте, CO6SENYA, Вы писали:

COS>помоги, плз.

COS>заранее спасибо.

Где улыбаться?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Проблема с менеджером кучи
От: CO6SENYA  
Дата: 16.12.06 17:58
Оценка: :)
Спасибо огромное. Я перерыл кучу инфы, но нигде не было написано про то, что выделение идёт строго по 4к бит. Может ты подскажешь ещё про разницу между менеджерами, у которых тип управления а)битовые поля б)списки ??
Re[3]: Проблема с менеджером кучи
От: LuciferMoscow Россия  
Дата: 16.12.06 20:05
Оценка: +1
Здравствуйте, CO6SENYA, Вы писали:

COS>Спасибо огромное. Я перерыл кучу инфы, но нигде не было написано про то, что выделение идёт строго по 4к бит.

А РИхтера уже отменили?
... << RSDN@Home 1.1.4 beta 4 rev. 358>>
Re: Проблема с менеджером кучи
От: Кодт Россия  
Дата: 18.12.06 09:42
Оценка:
Здравствуйте, CO6SENYA, Вы писали:

COS>void* operator new(size_t size,HANDLE k)
COS>{
COS>    puts("Run");
COS>    void *p;
COS>    if(k==NULL)
COS>    {
COS>        k=HeapCreate(0,0,100);
COS>    }

COS>    if((p=HeapAlloc(k,HEAP_ZERO_MEMORY,size))!=NULL)
COS>    {
COS>        puts("Pamyat videlena");
COS>        printf("%d\n",HeapSize(k,0,p));
COS>        return (p);
COS>    }
COS>    else
COS>    {
COS>        puts("Memory not run");
COS>        return NULL;
COS>    }
COS>}


Про то, что HeapCreate создаёт кучу размером со страницу — это уже сказали. А вот встречный вопрос: ты привёл реальный код или демонстрашилку?
Если реальный — то это просто страшилка. В первую очередь — из-за утечки хэндлов... Было бы хотя б вот так:
void* operator new(size_t size, HANDLE /*in,out*/ &k);
Перекуём баги на фичи!
Re[3]: Проблема с менеджером кучи
От: Pavel Dvorkin Россия  
Дата: 18.12.06 13:33
Оценка:
Здравствуйте, CO6SENYA, Вы писали:

COS>Спасибо огромное. Я перерыл кучу инфы, но нигде не было написано про то, что выделение идёт строго по 4к бит.


Байт, а не бит.
With best regards
Pavel Dvorkin
Re[3]: Проблема с менеджером кучи
От: _alm_ Украина  
Дата: 18.12.06 16:12
Оценка:
Здравствуйте, CO6SENYA, Вы писали:

COS>Спасибо огромное. Я перерыл кучу инфы, но нигде не было написано про то, что выделение идёт строго по 4к бит. Может ты подскажешь ещё про разницу между менеджерами, у которых тип управления а)битовые поля б)списки ??


Уф, ну и вопросы Тут на диссертацию хватит писать Если интересно, для начала рекмендую почитать, как устроены аллокаторы в GCC реализации STL (здесь) Там и ссылки для усугубления есть
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.