malloc&and和falling指针在返回

时间:2016-06-21 17:21:25

标签: c pointers memory memory-leaks valgrind

我被告知要写一个包装器,它取一个位置和编号的起始地址' 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;

}

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

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

我怀疑是:

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

b)没有malloc&#39;变量&#39;全球&#39; ?

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

d)在我的主要内容中,什么是免费的(ptr在做什么)?只需清除ptr malloc为1?

e)有没有办法检查那个10&#39;字节的分配是否成功?

2 个答案:

答案 0 :(得分: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;
}

然后用

来调用它
flag = alloc_func(&ptr, size);

那样ptr会改变。

答案 1 :(得分:1)

您要更改newptralloc_func的值。但是,这只是一个局部的变化。它不会更改调用函数中指针的值。因此,您有一个悬空指针和内存泄漏。

调用函数有一个悬空指针 alloc_func有内存泄漏。

您需要将新分配的指针从alloc_func返回到调用函数。您可以通过返回的值或通过将参数更改为指针指针来执行此操作。

解决方案1:返回指针

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

并将main中的通话更改为:

ptr = alloc_func(ptr, size); // not flag = ...

解决方案2:更改参数类型

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;
}

并将main中的通话更改为:

flag = alloc_func(&ptr, size); // Use &ptr, not ptr