内存泄漏在哪里?

时间:2012-09-23 01:34:10

标签: pointers memory-leaks pointer-arithmetic

所以我学习指针并且很难在这里识别内存泄漏。我承认我之前从未使用过malloc(),而且我是指针算法的新手。提前谢谢。

 /*filename: p3.c */
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char *buffer;
        char *p;
        int n;

        /* allocate 10 bytes */
        buffer = (char *) malloc(10);

        p = buffer;
        for (n=0; n<=10; n++)
                *p++ = '*';

        p = buffer;
        for (n=0; n <=10; n++)
                printf("%c ", *p++);

        return 0;
}

4 个答案:

答案 0 :(得分:3)

规则相当简单,每个malloc必须有一个免费的。如果你有更多mallocs而不是frees你忘了取消内存,所以你有内存泄漏。如果你有比malloc更多的空闲,你试图取消分配已经解除分配的内存,而这不是你想要的。

答案 1 :(得分:2)

当您不再需要缓冲区时,只需使用free()函数释放缓冲区:

    /* ... */
    free( buffer );
    return 0;
}

只需记住平衡每次拨打malloc,拨打free再次使用内存时

p变量上的操作不会影响buffer。它们是指向相同区域(开始时)的两个指针,但它们仍然是两个不同的变量。因此递增p不会增加buffer 所以p上的指针操作没有任何问题,除了写出界限之外,正如 Daniel Fisher 在您的问题评论中所述。

另请注意,在NULL来电之后,您应始终检查malloc ,因为malloc可能会失败。现在这种情况非常罕见,但是如果它失败了,你的程序可能会崩溃,因为你将取消引用NULL指针:

buffer = malloc( 10 );

if( buffer == NULL )
{
    /* Error management - Do not use buffer */
}

除非您正在处理C ++,否则char *上不需要转换为malloc。在C中,将void pointer分配给另一个指针类型是有效的。

答案 2 :(得分:2)

您致电malloc,永远不会致电free。当然它泄漏了。

原则上,您alloc系列功能请求的每个分配都应在free完成后立即执行。

您继续使用直到程序终止的缓冲区正式泄漏,但只要您分配明确定义的数量,就不会出现问题。这包括你在这里做的事情。

答案 3 :(得分:2)

你想要的不是n <= 10,但是n <10。