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

标签 c memory memory-management

当使用字符串文字初始化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()释放的内存。

编译器实现字符串文字的方式与您无关:它是实现细节。您可以free()指向您使用malloc()分配的内存的指针,并且只能使用这些,否则您将面临系统生命危险。

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

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

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

相关文章:

c - 有没有办法告诉 C 编译器指针没有别名存储?

c++ - 当人们忘记调用虚拟的基类版本时,有没有办法扫描?

c++ - 跟踪 C++ 内存分配

node.js - Node js 堆检查器中的全局句柄和 GC 根是什么?

algorithm - 如何最小化固定分配方案所需的内存量?

c - 循环中缺少错误(OpenMP with C)

c - 向标准 C 语法添加关键字

c - "Pointer from integer/integer from pointer without a cast"问题

java - Java 在内存(或其他地方)中如何表示对象的结尾?

Java实例变量数组大小基于另一个实例变量