2016-04-07 6 views
0

Я реализую свой собственный пул памяти в C, и у меня возникла проблема с поиском количества байтов, на которые указывает указатель на * ptr (size_t poolSize (void * ptr)). Код просто для того, чтобы показать часть того, что у меня есть и где проблема, я знаю, что мне приходится иметь дело с выравниванием и некоторыми другими вещами. Я также новичок в C, который я сам изучаю, поэтому я все еще изучаю, как работают указатели (моя проблема может быть с указателями).Управление пулом памяти в C

#include <stdio.h> 
#include <stdlib.h> 

typedef struct NODE MemPool; 

struct NODE 
{ 
    char * next; 
    char * end; 
}; 

MemPool * poolCreate(size_t size) 
{ 
    MemPool * newPool = (MemPool *)malloc(size + sizeof(MemPool)); 
    newPool->next = (char*)&newPool[1]; 
    newPool->end = newPool->next + size; 

    return newPool; 
} 

void * poolAlloc(MemPool *pool, size_t size) 
{ 
    void *result = NULL; 

    if((pool->end - pool->next) < size) 
     return NULL; 

    result = (void *)pool->next; 
    pool->next += size; 

    return result; 
} 

size_t poolSize(void *ptr) 
{ 
    return ((size_t)&ptr); 
} 

void poolDestroy(MemPool *pool) 
{ 
    free(pool); 
} 
+0

Что указывает 'ptr', когда вызывается' poolSize'? Указывает ли он на пул? Или к распределению, которое поступало из пула? Или что? – kaylum

+1

Вы набрасываете указатель на 'size_t', который, вероятно, очень ошибочен. Возможно, вы хотели направить указатель на 'size_t *' * и * разыменовать его? –

+0

Где вы храните данные? У NODE-структуры нет места для этого. Кроме того, не вычисляйте размеры. Добавьте член, имеющий размер, в структуру NODE. – GMichael

ответ

1

сколько байтов блока памяти, на который указывает * PTR

Нет, вы не стандартный способ найти размер выделенной памяти с самого указателя. Вы должны отслеживать размер самостоятельно, когда делаете malloc. или вам нужно сохранить размер выделенной памяти в другой переменной.

0

Не уверен, что именно вы хотите сделать кодом, но результат следующий:
1.

MemPool * newPool = (MemPool *)malloc(size + sizeof(MemPool)); 

выделить память:

[[ sizeof(MemPool) ][ size ]] 
^ 
| 
newPool 

2.

newPool->next = (char*)&newPool[1]; 

Установите указатель «next» на [size] часть выделенной памяти:

[[ sizeof(MemPool) ][ size ]] 
^     ^
|     | 
newPool    newPool->next 

3.

newPool->end = newPool->next + size; 

набор 'конец' указатель на конец выделенной памяти:

[[ sizeof(MemPool) ][ size  ]] 
^     ^   ^
|     |    | 
newPool    newPool->next newPool->end 

Может быть 'рядом' должен указывать на какой-то следующий узел пула? Если это указатель на пользовательской памяти, то она бесполезна из-за всегда может быть рассчитана как:

... = newPool + 1; 

Размер пользовательской памяти может быть вычислена как:

... = newPool->end - (char*)(newPool + 1); 

Согласно

size_t poolSize(void *ptr) 

вы не можете получить размер памяти только указателем void. Если это указатель на часть узла пула затем запуск узла может быть найден как:

MemPool * pool = (MemPool*)(ptr) - 1; 

, а затем использовал «конец» указатель найти размер назначения.

0

Это амбициозный проект для новичка. Вероятно, лучшим советом, который я мог бы дать, было бы найти реализацию, написанную кем-то еще, и изучить ее, пока вы ее не поймете.

Ответ на ваш вопрос требует отливки.Если предположить, что ptr указатель аннулируется к основанию блока арены:

size_t poolSize(void *ptr) { 
    MemPool* pool = (MemPool*)ptr; 
    return (size_t)(pool->next - (char*)ptr); 
} 

Надеется, что это помогает.

Смежные вопросы