无法释放C中的const指针

我怎样才能释放一个const char* ? 我使用malloc分配新的内存,当我试图释放它时,我总是收到错误“不兼容的指针types”

导致这个问题的代码是这样的:

 char* name="Arnold"; const char* str=(const char*)malloc(strlen(name)+1); free(str); // error here 

有几个人发布了正确的答案,但是由于某种原因,他们一直在删除它。 你需要把它转换成一个非const的指针; free需要一个void* ,而不是一个const void*

 free((char*)str); 

你的代码被颠倒了。

这个:

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

应该是这样的:

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

const存储types告诉编译器,你不打算修改一次分配的内存块(dynamic地或静态地)。 释放内存正在修改它。 请注意,您不需要传递malloc()的返回值 ,但这只是一个例外。

dynamic分配内存(你正在做的,基于name的长度)几乎没有用处,并告诉编译器你不打算使用它。 请注意, 使用意义写一些东西,然后(可选)稍后释放它。

投射到不同的存储types并不能解决您将存储types颠倒过来的事实:)它只是让一个警告消失,它试图告诉你什么。

如果代码被颠倒过来(因为它应该是), free()将按预期工作,因为你实际上可以修改你分配的内存。

malloc指向const的指针是没有意义的,因为你不能修改它的内容(没有丑陋的黑客)。

FWIW,但gcc只是给出了以下警告:

 // // const.c // #include <stdio.h> #include <stdlib.h> int main(void) { const char *p = malloc(100); free(p); return 0; } $ gcc -Wall const.c -o const const.c: In function 'main': const.c:8: warning: passing argument 1 of 'free' discards qualifiers from pointer target type $ 

你使用什么编译器?

把一个malloc'd指针指向const是没有用的。 任何使用const指针的函数都不应该负责释放传递给它的内存。

有些情况下你想释放一个const* 。 但是你不想这样做,除非你在同一个函数中分配/赋值。 否则你很可能会破坏事情。 请参阅下面的代码以获取真实世界的示例。 我在函数声明中使用const来显示我不改变参数的内容。 然而,它被重新分配一个需要释放的小型副本(strdup)。

 char* tolowerstring(const char *to_lower) { char* workstring = strdup(to_lower); for(;workstring != '\0'; workstring++) *workstring = tolower(workstring); return workstring; } int extension_checker(const char* extension, const char* to_check) { char* tail = tolowerstring(to_check); extension = tolowerstring(extension); while ( (tail = strstr( tail+1, extension)) ) { /* The +1 prevents infinite loop on multiple matches */ if ( (*extension != '.' ) && ( tail[-1] != '.')) continue; if ( tail[strlen(extension)] == '\0') { free(tail); free( (char*) extension); return 1; } } free(tail); free( (char *) extension); return 0; } 

我可能是错的,但我认为问题在于const 。 将指针转换为非const,如下所示:

 free((char *) p); 

因为用const你说: 不要改变这个指针指向的数据

你不能释放const char *因为它是const 。 将从malloc接收到的指针存储在非常量指针variables中,以便您可以将它们传递给free 。 您可以将char *parameter passing给采用const char *参数的函数,但相反并不总是正确的。

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

如果你正在谈论纯C,并且你完全控制了内存分配,你可以使用下面的技巧把(const char *)强制转换为(char *),这样就不会在编译器中给出任何警告:

 const char *const_str = (const char *)malloc(...); char *str = NULL; union { char *mutable_field_p; const char *const_field_p; } u; u.const_field_p = const_str; str = u.mutable_field_p; 

现在你可以使用free(str); 释放内存。

但是要注意,这是超越言辞的邪恶,应该只在严格控制的环境下使用(例如,分配和释放string的库,但不想让用户修改它们)否则当有人提供程序时,程序崩溃编译时间“STRING”到您的免费​​function。

我认为,即使你把这个指针指向一个非const,空闲的结果依赖于实现。 通常const是为你不想修改的variables而devise的!