gpt4 book ai didi

c - 重新分配期间 Valgrind 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 18:23:38 25 4
gpt4 key购买 nike

我不确定为什么 Valgrind 会报告内存泄漏?

.c 文件中的伪代码:

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

char* str_alloc(char *str) {
char* dup = (char*) malloc((strlen(str) + 1) * sizeof(char));
strcpy((char*) dup, (char*) str);
return dup;
}

void function_c(char **name) {
int len = 10;
(void) realloc(*name, 100);
}

void function_b(char **name) {
(void) function_c(name);
}

void function_a(char **name) {
(void) function_b(name);
}

int main() {
char* name = str_alloc("");
function_a(&name);
// Do something with name
free(name);
}

我忽略了 realloc 的值,因为我确信 realloc 将始终位于同一指针上。从我自己的内存池分配/重新分配,这是相当大的。

当然,我不能在这里编写内存池的代码。

那么,在什么情况下我会出现 Valgrind 泄漏?我想到的几个案例:

  • 如果重新分配的内存较小。 realloc 保证会处理好它。
  • 如果realloc失败,则应该是内存泄漏。我明白这一点。

还有其他案例吗?

最佳答案

存在内存泄漏,因为您丢失了 realloc 分配的内存。

realloc 的语法如下。

void *realloc(void *ptr, size_t size); 

注意:不保证 realloc 返回的指针与传递给 realloc 的旧指针相同,并且不应依赖它。

甚至编译器也会警告您同样的情况。

warning: ignoring return value of ‘realloc’, declared with attribute warn_unused_result [-Wunused-result]

(void) realloc(*name, 100);
^

因此您需要修改您的 function_c 函数,如下所示。

 void function_c(char **name) 
{
char *newPtr = NULL;
newPtr = realloc(*name, 100);
*name = newPtr;
}

关于c - 重新分配期间 Valgrind 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52479755/

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