内存realloc风险

时间:2011-12-23 14:07:55

标签: c memory-management

我需要知道,使用realloc()函数获取额外内存是否有任何风险?

例如,我将一些流存储到char*变量中。问题是我们不能在开头指定输入流的最大大小,所以我们需要不时地扩展内存区域。

我的问题是:重新分配内存会导致重新分配变量的数据丢失吗?

5 个答案:

答案 0 :(得分:2)

如果我正确使用它,我可以丢失数据吗?

不,使用realloc时不应该有任何数据丢失,它应该在语法上与执行以下操作相同。

new_memory = malloc (new_size);

if (new_memory != NULL) {
    memcpy (new_memory, old_memory, old_size < new_size ? oldsize : new_size);
    free   (old_memory);
}

return newp;

如果重新分配失败怎么办?

如果重新分配失败(即没有分配新的内存),指向old_memory的指针仍然有效,所以请不要这样做:

my_memory = realloc (my_memory, new_size); 

  /*
   * if the allocation fails you will lose the pointer to your memory,
   * which will make you:
   *   a) lose your data
   *   b) have a memory leak
   * */

标准对realloc有什么看法?

答案 1 :(得分:1)

您不会丢失任何调用realloc的数据,但分配可能会失败,就像malloc一样。这通常被视为终端。如果内存块无法就地调整大小,则会创建一个新块,并将旧块的内容复制到新块中。

答案 2 :(得分:1)

理论上,是的,如果您执行以下操作,可能会导致内存泄漏(从而丢失数据):

void *data = malloc(5);
data = realloc(data, 999999999999999999999999999);

data现在是NULL,因为realloc()如果失败则返回NULL。所以为了安全起见,你可以只用一个单独的指针来测试它:

void *data = malloc(5);
void *tmp = realloc(data, 999999999999999999999999999);
if (tmp != NULL) {
    data = tmp;
}

话虽如此,如果malloc()calloc()realloc()无法为您提供所需的记忆,无论如何都会遇到大问题。你的程序中有一个错误,你有太多的数据需要处理,或者你的盒子有太少的内存。

答案 3 :(得分:1)

要记住的重要一点是,realloc()通常不会只是增加记忆块;它将移动您的数据。旧指针到内存变得无效。跟踪原始块的任何指针并确保它们得到更新是非常重要的;否则数据将出现丢失或损坏。

答案 4 :(得分:0)

只要指定的大小大于数据大小,Realloc就会保留您的数据。

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/