概述:
void *realloc(void *ptr, size_t size)
realloc实在原有内存基础上直接从队上再分配指定数量的内存块,如果分配成功,返回新的地址,这样隐含源地址失效的风险。
例如:
char *p,*q;
p = malloc(sizeof(char)*1024);
q = p;
p = realloc(p,1024);//可能造成q指针失效,因为p在这过程中已经释放了。
源码如下:
void *realloc(void *ptr, size_t size)
{
memblock_t *m;
void *new = NULL;
if (ptr) {
if (!(m = memblock_get(ptr))) {
printk(KERN_ERR "bug: realloc non-exist memory\n");
return NULL;
}
if (size == m->size)
return ptr;
if (size != 0) {
if (!(new = kmalloc(size, GFP_KERNEL)))
return NULL;
memmove(new, ptr, m->size);//数据拷贝
if (memblock_add(new, size)) {
kfree(new);
return NULL;
}
}
memblock_del(m);
kfree(ptr);//造成风险
} else {
if (size != 0) {
if (!(new = kmalloc(size, GFP_KERNEL)))
return NULL;
if (memblock_add(new, size)) {
kfree(new);
return NULL;
}
}
}
return new;
}