我需要知道,使用realloc()
函数获取额外内存是否有任何风险?
例如,我将一些流存储到char*
变量中。问题是我们不能在开头指定输入流的最大大小,所以我们需要不时地扩展内存区域。
我的问题是:重新分配内存会导致重新分配变量的数据丢失吗?
答案 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/