gpt4 book ai didi

c - 我应该释放使用字符串文字初始化的 char* 吗?

转载 作者:IT王子 更新时间:2023-10-28 23:29:43 26 4
gpt4 key购买 nike

当使用字符串文字初始化 char* 变量时,我应该释放它们吗?对我来说,语法会让我假设它们只是堆栈分配的,但这个例子告诉我,它们不是。

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

static char* globalBuffer;

typedef struct Container {
char* buffer;
} Container;

Container* Container_new(char* buffer) {
Container* container = malloc(sizeof(Container));
container->buffer = buffer;
globalBuffer = buffer;
return container;
}

void Container_print(Container* container) {
if (container->buffer != NULL) {
printf("%s", container->buffer);
printf("\n");
}
else {
printf("Container contains a NULL-buffer.");
}
}

Container* stage() {
Container* container = Container_new("Test-string.");
Container_print(container);
return container;
}

int main() {
Container* container = stage();
Container_print(container);

free(container);
Container_print(container); // I know, this results in undefined behaviour

printf(globalBuffer);
printf("\n");

return 0;
}

我得到以下输出:

C:\Users\niklas\Desktop>gcc char_test.c

C:\Users\niklas\Desktop>a.exe
Test-string.
Test-string.
­6>
Test-string.

C:\Users\niklas\Desktop>

因此,使用字符串文字初始化的 char* 仍然存在,即使它超出了范围。

那么,我的问题是,我应该释放这样的 char* 指针吗?这是正确的 main() 吗?

int main() {
Container* container = stage();
Container_print(container);

free(container->buffer); // NEW
free(container);
Container_print(container);

printf(globalBuffer);
printf("\n");

return 0;
}

最佳答案

你永远不能free()你没有malloc()ed的内存。

编译器实现字符串文字的方式与您无关:这是一个实现细节。您可以 free() 一个指向您使用 malloc() 分配的内存的指针,并且只能使用那些,否则您会冒着系统生命周期的风险。

理想情况下,malloc() 调用和 free() 调用应该出现在同一个“设计级别”上(例如,在同一个模块的同一个实现文件中) ,并且它们应该完美匹配:每个 malloc() 对应一个 free()。但这并不总是可能的。

(请注意,某些库分配内存块,返回指向这些 block 的指针,并指示您释放它们。在这种情况下,您可以释放这些指针,但从创建图书馆的人。)

关于c - 我应该释放使用字符串文字初始化的 char* 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504588/

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