问题已经说得很清楚了,这里是一个示例:
typedef struct mutable_t{
int count, max;
void **data;
} mutable_t;
void pushMutable(mutable_t *m, void *object)
{
if(m->count == m->max){
m->max *= 2;
m->data = realloc(m->data, m->max * sizeof(void*));
}
// how to handle oom??
m->data[m->count++] = object;
}
我该如何处理内存耗尽而不会将所有数据都设为NULL?
编辑 - 假设有一些可以做的事情,例如释放某些内存或至少告诉用户“你不能这样做 - 你的内存已用完”。理想情况下,我希望保留先前分配的内存。
realloc()
(在你的情况下),一个想法是执行m->max /= 4; m->max *= 3;
,然后再尝试调用realloc()
,看看我们是否仍然可以挤出更多的字节。你甚至可以尝试几次,每次使用越来越小的大小,但在某些时候这样做就不值得了。 - Chris Lutz