无法在C中释放常量指针

92

我如何释放一个const char*?我使用malloc分配了新的内存,在尝试释放它时,总是会收到 "不兼容的指针类型" 错误。

引起这个错误的代码大致如下:

char* name="Arnold";
const char* str=(const char*)malloc(strlen(name)+1);

free(str); // error here

6
基本上是一个C语言问题。free()的签名应该是void free(const void* p);。在C++中已经被修复(使用delete)。 - MSalters
9
@James Kingsbery:interned strings,或许可以这么说:一旦您初始化了字符缓冲区,之后将其视为const char*是很有意义的。提问者真的需要我们的批准才能遇到问题吗?;-) - Steve Jessop
7
然而,这根本没有任何意义。一旦内存被分配给str,就无法通过str来更改它,这意味着当malloc()抓取它时,内存中包含的内容是永久的。不加转换就无法将名称复制到其中。 (此外,将字符串文字分配给char *不好,因为尝试修改字符串文字是未定义的行为。我认为您只是混淆了const。) - David Thornley
4
你得到的 const char * 可能会在填充内容后从 char * 转换而来,例如从 const char* foo() { char* s = malloc(...); strcpy(s, ...); return s; } 这样的函数中。 - musiphil
在C语言中无法释放常量指针:在给定的代码片段中,const指针在哪里? - haccks
显示剩余4条评论
12个回答

-2

我认为即使你将指针转换为非const类型,free函数的结果仍取决于实现。通常const是为了那些你不想修改的变量而设计的!!


-4

您不能释放const char *,因为它是const。将从malloc接收到的指针存储在非常量指针变量中,以便您可以将它们传递给free。您可以将char *参数传递给需要const char *参数的函数,但反过来则不总是成立。

void foo (const char *x);
char *ptr = malloc (...);
foo (ptr);
free (ptr);

6
在C++中,您可以delete一个const char*。那么为什么不应该这样做呢?指针防止字符被修改的事实并不应该阻止您在不再需要字符串时删除它。但我对C的了解还不够深入。有没有任何人能引用标准库的语句来说明呢? - sbi
3
指针的常量性不会以任何方式影响您释放它的能力。 - Hasturkun
2
@JeremyP:答案是未定义行为(或可能是鼻涕鬼),但这并不是由于“const”的原因,而是由于尝试释放字符串常量引起的。 - Hasturkun
2
@JeremyP 那个例子是似是而非的;它是错误的,但不是因为字符串是const,它只是字符串字面值的一个特殊情况。 - Michael Mrozek
2
@JeremyP:“永远不应该释放const char*。”我不同意。如果这是真的,那么你就永远不能有被动态分配的const字符串,因为你不能删除它们。这很愚蠢。无论某个东西是否被动态分配以及它是否不应该被更改都是独立的问题。我可以拥有不希望更改但必须在某些时候释放的动态分配字符串。我认为这是C标准库中的一个错误,可能源于C后来才从C++中采用了const,现在有点像是一个红发继子。 - sbi
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接