为C中的指针重新分配比最初更少的内存

时间:2013-12-17 11:58:09

标签: c sizeof realloc

如果我尝试使用realloc为指针分配的内存少于最初分配的内存,是否会释放冗余内存或重新分配会导致内存泄漏?

我不知道如何测试这个,sizeof似乎返回相同的值,与我做多少重新分配无关。

4 个答案:

答案 0 :(得分:3)

mallocrealloc的重点在于你得到的记忆,你可以免费而不泄漏(如果你正确使用它)。因此,如您所述,使用realloc是正确的,不会泄漏。

文档没有明确说明这一点,但暗示使用这些函数会导致正确的分配和释放内存。否则就没有理由存在这些功能。

  

realloc()将ptr指向的内存块的大小更改为      大小字节。内容将保持最低限度      和新的尺寸;新分配的内存将是未初始化的。如果是ptr      NULL,该调用相当于malloc(size);如果大小等于零,      该调用相当于free(ptr)。除非ptr为NULL,否则它必须具有      早先调用malloc(),calloc()或realloc()返回。      如果指向的区域被移动,则完成免费(ptr)。

http://unixhelp.ed.ac.uk/CGI/man-cgi?realloc+3

答案 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()实习生释放指针指向的旧内存分配。