实现 realloc

lua5.03 有


/*
** definition for realloc function. It must assure that l_realloc(NULL,
** 0, x) allocates a new block (ANSI C assures that). (`os' is the old
** block size; some allocators may use that.)
*/
#ifndef l_realloc
#define l_realloc(b,os,s)    realloc(b,s)
#endif

/*
** definition for free function. (`os' is the old block size; some
** allocators may use that.)
*/
#ifndef l_free
#define l_free(b,os)    free(b)
#endif

void *luaM_realloc (lua_State *L, void *block, lu_mem oldsize, lu_mem size) {
  lua_assert((oldsize == 0) == (block == NULL));
  if (size == 0) {
    if (block != NULL) {
      l_free(block, oldsize);
      block = NULL;
    }
    else return NULL;  /* avoid `nblocks' computations when oldsize==size==0 */
  }
  else if (size >= MAX_SIZET)
    luaG_runerror(L, "memory allocation error: block too big");
  else {
    block = l_realloc(block, oldsize, size);
    if (block == NULL) {
      if (L)
        luaD_throw(L, LUA_ERRMEM);
      else return NULL;  /* error before creating state! */
    }
  }
  if (L) {
    lua_assert(G(L) != NULL && G(L)->nblocks > 0);
    G(L)->nblocks -= oldsize;
    G(L)->nblocks += size;
  }
  return block;
}
 

 

lua5.1.5 开始有了

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  (void)ud; (void)osize;  /* not used */
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else
    return realloc(ptr, nsize);
}

那么realloc 怎么实现呢?

 

http://armbbs.cn/forum.php?mod=viewthread&tid=95936

二楼实现如下:

裸机下,直接调用rt_init_mem,rt_alloc_mem,rt_free_mem实现realloc是可以用,不用OS开头的
void *ReallocMem(void *p, size_t size)
{
        void *pnew;

           //Allocate a memory block
   pnew = rt_alloc_mem(AppMallocCCM, size);//malloc(size);
   //copy oldmemory block
   memcpy(pnew, p, size);
   //Free memory block
   rt_free_mem(AppMallocCCM, p);//free(p);
       
   //Return a pointer to the newly allocated memory block
   return pnew;       
}

改造如下:

void *my_realloc(void *ptr, size_t nsize)
{
   void *new_ptr;
   new_ptr = malloc(nsize);
   memcpy(new_ptr, ptr, nsize);
   free(ptr);
   return new_ptr;        
}
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  (void)ud; (void)osize;  /* not used */
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else if (ptr == NULL) {
        return malloc(nsize);
    }
    else 
    return my_realloc(ptr, nsize);
}

 

再次改造

void *my_realloc(void *ptr, size_t nsize)
{
   void *new_ptr;
   new_ptr = malloc(nsize);
     if (new_ptr) {
         memcpy(new_ptr, ptr, nsize);
         free(ptr);
     }
   return new_ptr;        
}
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  (void)ud; (void)osize;  /* not used */
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else if (ptr == NULL) {
        return malloc(nsize);
    }
    else 
    return my_realloc(ptr, nsize);
}

再次改造 :

 

void *my_realloc1(void *ptr, size_t nsize)
{
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else if (ptr == NULL) {
        return malloc(nsize);
    }
    else {
        void *new_ptr;
        new_ptr = malloc(nsize);
        if (new_ptr) {
         memcpy(new_ptr, ptr, nsize);
         free(ptr);
        }
        return new_ptr; 
    }
    
}
 

上面这个实现方式和realloc还是有区别的。比如如果再次申请的小于原先的,则realloc会仍然用原先的ptr实际地址。

而我上面的my_realloc1是,如果再次申请的小于原先的,则my_realloc1会再次申请地址,然后释放原先的地址。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值