我如何释放一个const char*
?我使用malloc
分配了新的内存,在尝试释放它时,总是会收到 "不兼容的指针类型" 错误。
引起这个错误的代码大致如下:
char* name="Arnold";
const char* str=(const char*)malloc(strlen(name)+1);
free(str); // error here
我认为即使你将指针转换为非const类型,free函数的结果仍取决于实现。通常const是为了那些你不想修改的变量而设计的!!
您不能释放const char *
,因为它是const
。将从malloc
接收到的指针存储在非常量指针变量中,以便您可以将它们传递给free
。您可以将char *
参数传递给需要const char *
参数的函数,但反过来则不总是成立。
void foo (const char *x);
char *ptr = malloc (...);
foo (ptr);
free (ptr);
delete
一个const char*
。那么为什么不应该这样做呢?指针防止字符被修改的事实并不应该阻止您在不再需要字符串时删除它。但我对C的了解还不够深入。有没有任何人能引用标准库的语句来说明呢? - sbiconst char*
。”我不同意。如果这是真的,那么你就永远不能有被动态分配的const
字符串,因为你不能删除它们。这很愚蠢。无论某个东西是否被动态分配以及它是否不应该被更改都是独立的问题。我可以拥有不希望更改但必须在某些时候释放的动态分配字符串。我认为这是C标准库中的一个错误,可能源于C后来才从C++中采用了const
,现在有点像是一个红发继子。 - sbi
void free(const void* p);
。在C++中已经被修复(使用delete
)。 - MSaltersconst char*
是很有意义的。提问者真的需要我们的批准才能遇到问题吗?;-) - Steve Jessopstr
,就无法通过str
来更改它,这意味着当malloc()
抓取它时,内存中包含的内容是永久的。不加转换就无法将名称复制到其中。 (此外,将字符串文字分配给char *
不好,因为尝试修改字符串文字是未定义的行为。我认为您只是混淆了const
。) - David Thornleyconst char *
可能会在填充内容后从char *
转换而来,例如从const char* foo() { char* s = malloc(...); strcpy(s, ...); return s; }
这样的函数中。 - musiphilconst
指针在哪里? - haccks