如果我尝试使用realloc
为指针分配的内存少于最初分配的内存,是否会释放冗余内存或重新分配会导致内存泄漏?
我不知道如何测试这个,sizeof
似乎返回相同的值,与我做多少重新分配无关。
答案 0 :(得分:3)
malloc
和realloc
的重点在于你得到的记忆,你可以免费而不泄漏(如果你正确使用它)。因此,如您所述,使用realloc
是正确的,不会泄漏。
文档没有明确说明这一点,但暗示使用这些函数会导致正确的分配和释放内存。否则就没有理由存在这些功能。
realloc()将ptr指向的内存块的大小更改为 大小字节。内容将保持最低限度 和新的尺寸;新分配的内存将是未初始化的。如果是ptr NULL,该调用相当于malloc(size);如果大小等于零, 该调用相当于free(ptr)。除非ptr为NULL,否则它必须具有 早先调用malloc(),calloc()或realloc()返回。 如果指向的区域被移动,则完成免费(ptr)。
答案 1 :(得分:3)
内存泄漏的定义是:内存因为丢失了所有指针(“句柄”)而无法再释放。由于realloc()
返回指向可能移动位置的指针,因此在这种意义上它不会产生泄漏。缩小后的多余内存是否可用于进一步分配是特定库的实现细节。
但是请注意,如果不使用临时变量,实际上可以轻松地使用realloc
创建内存泄漏:
m = realloc (m, size); /* Potential memory leak. */
如果realloc
返回NULL
,则您丢失了先前的m
值(好吧,我们内存不足,因此内存泄漏现在只是另一个问题,但是仍然)。我建议养成写作的习惯
t = realloc (m, size);
if (t != NULL)
m = t;
else
deal_with_out_of_memory_situation ();
请注意,sizeof
从不产生已分配内存的大小,但总是对象的大小(对于分配内存的指针,大小为指针,而不是指向内存的大小。)
答案 2 :(得分:2)
来自男人:
realloc()
创建一个新的 分配,复制尽可能多的ptr指向的旧数据 到新的分配,FREES THE OLD ALLOCATION,并返回指向 分配的内存。
所以我认为它不会导致内存泄漏
答案 3 :(得分:1)
realloc()实习生释放指针指向的旧内存分配。