无法释放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的!