一旦你打电话
realloc
,如果它返回非空值,则
old
(包含前一个指针值)变为
不确定
因此,尝试使用此值(即使您没有取消引用它)可能会导致
undefined behavior
.
在这种情况下,你应该做的就是打电话
gcLocalPop
打电话之前
realloc
,然后打电话
gcLocalPush
无论成功与否。
void* gcLocalRealloc(gc_t *gc, void* ptr, size_t SIZE) {
if (SIZE == 0) {
gcFree(ptr);
return ptr = NULL;
}
assert(SIZE > 0);
if (ptr == NULL) return gcLocalMalloc(gc, SIZE);
int old_size = gcLocalPop(gc, ptr);
void* old = ptr;
ptr = realloc(ptr, SIZE);
if (ptr != NULL) {
gcLocalPush(gc, ptr, SIZE);
return ptr;
} else {
gcLocalPush(gc, old, old_size);
return old;
}
}
请注意,您必须进行修改
gcLocalPop
在需要放回物品的情况下,返回被移除物品的尺寸
realloc
失败。