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)
#endifvoid *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会再次申请地址,然后释放原先的地址。