C

时间:2016-04-07 05:46:04

标签: c memory-management

我在C中实现自己的内存池,我遇到的问题是找出* ptr指向的内存块有多少字节(size_t poolSize(void * ptr))。代码只是为了展示我所拥有的部分以及问题所在,我知道我必须处理对齐和其他一些事情。我也是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);
}

2 个答案:

答案 0 :(得分:1)

  

* ptr

指向的内存块有多少字节

不,您没有标准方法从指针本身查找已分配内存的大小。在进行malloc时,您必须自己跟踪大小。或者您必须将分配的内存大小存储在另一个变量中。

答案 1 :(得分:0)

不确定代码究竟要做什么,但结果如下:
1。

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

分配内存:

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

2

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

设置&#39; next&#39;指向已分配内存的[size]部分的指针:

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

3

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

设置&#39;结束&#39;指向已分配内存结尾的指针:

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

也许&#39; next&#39;应该指向一些下一个池节点?如果它是一个指向自定义内存的指针,那么无用的可能总是计算为:

... = newPool + 1;

自定义内存的大小可以计算为:

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

根据

size_t poolSize(void *ptr)

你无法通过void指针获得内存大小。如果它是指向池节点的一部分的指针,则可以找到节点的开始:

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

然后使用&#39;结束&#39;指针找到目标大小。