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

标签 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 时,泄漏摘要说 “绝对丢失:1 个 block 中的 10 个字节”

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

我的疑问是:

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

b) malloc 变量不是“全局”变量吗?

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

d) 在我的 main 中,什么是免费的(然后 ptr 在做什么)?只是清除为 1 分配的 ptr?

e) 有什么方法可以检查这 10 个“size”字节的分配是否成功?

最佳答案

你的 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 就会改变。

关于c - malloc'ing 和 realloc'ing 指针在返回时导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37950769/

相关文章:

无法从 'int *' 转换为 'int'

c - 将成员 C 函数指针分配给另一个成员作为默认参数

c++ - Malloc 似乎比 new[] 使用更少的内存

c - 超过 1 个链表 - 添加元素

c - 如何在 Visual Studio 项目中引用用户定义段的开始?

c - 在函数中释放 C** 指针 malloc 时出错

python - 运行后memmap文件在哪里?

javascript - 我如何重用 JavaScript 中的对象?

C - 复制整数

计算 n 个整数的最小值