|
发表于 2004-10-20 09:05:53
|
显示全部楼层
类似如此,不过链表更灵活。
typedef struct memnode
{
char *pmembuf;
int nbufsize;
struct *pnext;
};
struct memnode *g_pmempool = NULL;
void puttomempool(struct memnode * pmemnode)
{
pmemnode->pnext = NULL;
if (g_pmempool == NULL)
{
g_pmempool = pmemnode;
return;
}
pmemnode->pnext = g_pmempool->pnext;
g_pmempool->pnext = pmemnode;
return;
}
int initmempool(int nnodenum, int nbufsize)
{
struct memnode *pmemnode;
int i;
for (i=0; i<nnodenum; i++)
{
pmemnode = (struct memnode *)malloc(sizeof(struct memnode));
if (pmemnode == NULL)
{
return -1;
}
pmemnode->pmembuf = (char*)malloc(nbuffize);
if (pmemnode->pmembuf == NULL)
{
free(pmemnode);
return -1;
}
pmemnode->nbufsize = nbuffsize;
puttomempool(pmemnode);
}
return 0;
}
要使用内存的时候:
struct memnode * getfrommempool()
{
struct memnode *pmemnode;
if (g_pmempool == NULL)
{
/*内存池里的内存已经用完,需要按照initmempool函数里那样重新分配 */
pmemnode = malloc(...);
/* 分配成功了不用插入链表,直接返回 */
}
else
{
/* 内存池里还有内存,取出一个返回 */
pmemnode = g_pmempool;
g_pmempool = g_pmempool->pnext;
}
return pmemnode;
}
如果是多线程程序,需要对 g_pmempool加锁,用了这个之后,用getfrommempool代替malloc,用puttomempool代替free。然后在程序退出的时候对g_pmempool的结点进行遍历释放,记得不仅要free每个结点,同时也要free每个结点的pmembuf指针
大体思路就是这样,顺手写的。 |
|