【发布时间】:2010-12-31 11:42:32
【问题描述】:
问题说明了一切,但这里是一个例子:
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 的所有数据?
edit - 让我们假设有一些事情可以做,例如在某处释放一些内存或至少告诉用户“你不能这样做 - 你内存不足”。理想情况下,我想把分配的东西留在那里。
【问题讨论】:
-
高度依赖应用程序...但可以肯定的是,OOM 非常关键。
-
只是在这里添加几个答案,关于如何处理失败的
realloc()(在您的情况下)的想法是执行m->max /= 4; m->max *= 3;并尝试再次调用realloc()以查看是否我们仍然可以挤出更多的字节。你甚至可以尝试几次,尺寸逐渐变小,但在某些时候它是不值得的。 -
if (!m->data) { log("请升级到64位版本");中止(); }