gpt4 book ai didi

c - 为什么当我将堆对象传递给函数时不需要释放它们?

转载 作者:行者123 更新时间:2023-11-30 14:46:19 24 4
gpt4 key购买 nike

以下程序没有内存泄漏。我的问题是,为什么 str1 和 str2 不必传递到 free() 中,即使我对这两个字符串都进行了 malloc?请参阅代码中我尝试释放 str1 和 str2 的两个注释位置,取消注释该代码会导致错误说我释放了非堆对象。但根据我的理解,str1和str2是由malloc创建的对象,因此是堆对象。我不明白这个矛盾。

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

char* StrCat(char* s1, const char* s2) {
// Removing const from const char* s2
// made no difference on memory leak error message
char *s, *tmp;
s = tmp = malloc(strlen(s1) + strlen(s2) + 1);
strcpy(tmp, s1);
tmp += strlen(s1);
strcpy(tmp, s2);
//free(str1); free(str2); Why not?
printf("%d\n", s[strlen(s)] == '\0'); // Prints 1
return s;
}

int main(int argc, char** argv) {
char* str1 = malloc(4 * sizeof (char));
str1 = "abc\n";
char* str2 = malloc(6 * sizeof (char));
str2 = "party\n";

char* new = StrCat(str1, str2);
//free(str1); free(str2); Why not?
printf("%s\n", new);
free(new); // Required
return 0;
}

最佳答案

当然,您需要释放堆对象,无论是否将它们传递给函数。无论您将如何使用它,malloc() 返回的任何内容最终都必须被 free() 释放。

您的问题如下:

以下行:

char* str1 = malloc(4 * sizeof (char));

分配 4 个字符的内存并将其引用存储在 str1 中。

以下行:

str1 = "abc\n";

忘记str1指向的任何内存(从而导致内存泄漏),并使str1指向程序静态数据段中的新位置。这是从未分配的内存,因此可能无法释放。

为了解决您的问题,您需要使用 strcpy(),而不是将 str1 设置为指向 "abc\n"“abc\n”复制到str1指向的已分配内存块。

在执行此操作之前,请不要忘记将 46 各加 1,因为 C 中的字符串也包含空终止字节,因此您需要分别为 57 字符分配空间。

关于c - 为什么当我将堆对象传递给函数时不需要释放它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52359281/

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