你可以确定一个字符串是否可以在C中释放?

Aar*_*ken 5 c malloc

如果我说:

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

char *x;
char *y;

int main() {
        x = malloc(sizeof("Hello, world!"));
        strcpy(x, "Hello world!");
        y = "Hello, world";
        free(x);
        fprintf(stderr, "okay");
        free(y);
}
Run Code Online (Sandbox Code Playgroud)

然后,显然,程序将打印"okay",然后死亡,因为"指针被释放未被分配" - 显然,因为字符串是一个字符串文字.

我想编写一个在给定字符串文字时不执行任何操作的函数,但在给定非字符串文字时调用free.这有可能,如果是的话,怎么样?

Mat*_*nen 9

我不认为标准有什么用于检查指针是否由malloc返回(并且你只应该将它们传递给free)所以我会说不,你找不到它.你必须自己跟踪它.

  • +1:这是迄今为止唯一的答案,并没有提出一些可怕的非便携,非强健机制,而是简单地说"不要那样做". (2认同)

Ada*_*eld 5

不可以.在C中,您必须跟踪自己分配的内容.

某些malloc实现(例如dlmalloc)为检查堆提供了一些额外的功能,但您不应该依赖它们. dlmalloc具有该函数dlmalloc_inspect_all,它将遍历堆并返回malloc已分配的所有内存区域,但内存映射块除外.因此,您可以使用它来测试指针是否指向非内存映射分配,但一般来说这仍然是一个坏主意.

在Windows上,甚至不要考虑使用[ IsBadReadPtr]来测试指针是否指向可读内存 - 它应该被真正调用CrashProgramRandomly.