gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:20:08 26 4
gpt4 key购买 nike

我被告知要编写一个包装器,它采用位置的起始地址和大小的数字“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com