malloc'ing和realloc'ing指针在返回时导致内存泄漏

vin*_*win 2 c memory valgrind pointers memory-leaks

我被告知写一个包装器,它取一个位置的起始地址和数字'n'的大小.之后,使用此内存来存储内容.我能够编写代码,但程序中存在内存泄漏.这是该计划:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int alloc_func(char *newptr, int size)
{
    newptr = (char *)realloc(newptr, size);
    printf("In func: %p\n", newptr);
    if(NULL == newptr)
        return 0;
    else
        return 1;
}

int main(int argc, char **argv)
{
    char *foo = "Computer";  //string to be copied to newly allocated memory

    char *ptr = (char *)malloc(1*sizeof(char));
    printf("Before return: %p\n", ptr);
    int size = 10, flag;

    flag = alloc_func(ptr, size);

    printf("After return: %p\n", ptr);

    if(flag == 0)
        return EXIT_FAILURE;
    else{
        strcpy(ptr, foo);
    }

    printf("The copied string is: %s\n", ptr);

    free(ptr);

    return 0;
Run Code Online (Sandbox Code Playgroud)

}

在运行valgrind时,泄漏摘要说"绝对丢失:1个块中的10个字节"

发生这种情况是因为我将ptr(起始地址)作为指针值发送到函数,因此函数正在创建指针的副本,即程序中的newptr.这个newptr正在重新分配到10个位置.由于我没有返回newptr,一旦函数结束,我的'realloc'ed'位置将超出范围并丢失.

我的疑问是:

a)即使创建了指针的副本,ptr和newptr也将指向同一个内存位置,那为什么会泄漏呢?

b)malloc'ed变量不是'全球'吗?

c)是否发生了泄漏,因为我没有传递指针的地址,因此不会创建副本?(我试过这个,但我想知道为什么)

d)在我的主要内容中,什么是免费的(ptr在做什么)?刚刚清理ptr malloc'ed为1?

e)有没有办法检查那10个"大小"字节的分配是否成功?

Fre*_*edK 5

你的alloc_func()方法应该是:

int alloc_func(char **newptr, int size)
{
    char *p = (char *)realloc(*newptr, size);
    printf("In func: %p\n", p);
    if(NULL == p) {
        return 0;
    } else {
        *newptr = p;
        return 1;
}
Run Code Online (Sandbox Code Playgroud)

你打电话给它

flag = alloc_func(&ptr, size);
Run Code Online (Sandbox Code Playgroud)

那样ptr会改变.