有一个C风格的字符串,我需要释放它的记忆。我看到了以下代码示例,但对于为什么(void*)
感到困惑。
char *data = "abc";
free( (void*)data );
只有两个问题:
为什么不简单地free(data)
?
(void*)
转换是必须的吗?
非常感谢。
答案 0 :(得分:6)
不,没有必要; free()
来电是错误的,你不能这样做。
演员是一个巨大的眨眼,弹跳,尖叫警告旗,原始程序员感到困惑。
未定义的行为是将前一次调用未返回的指针传递给malloc()
或其中一位朋友的free()
。演员阵容是这里最少的问题。
你永远不能免费"字符串文字使用的内存,因为该内存永远不会以程序控制的某种方式分配。它不在堆上,而堆通常发生动态内存分配/释放。你的意图是错的。
您所能做的就是将指针设置为NULL
:
data = NULL;
不会以任何方式"免费"虽然在幕后用于保存角色数据"abc"
的内存,但这很好。
答案 1 :(得分:3)
调用free()
是错误的,因为未使用(m/c/re)alloc
分配。
正如Jens Gustedt所指出的,只有当你传递const
指针时才需要强制转换,因为free()
需要void *
,而不是const void *
:
const int *x = malloc(sizeof(int));
free((void *)x);
没有演员阵容你会得到:
demo.c:8:5: warning: passing argument 1 of ‘free’ discards ‘const’ qualifier from pointer target type [enabled by default] In file included from demo.c:2:0: /usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘const int *’
答案 2 :(得分:0)
演员阵容是不必要的。在C中,void*
可以隐式转换为其他指针类型。 free
期望void*
,因此不需要从另一个指针类型转换。
(当然,正如已经指出的那样,代码显然是完全有问题的,所以不要过多地阅读它。)
答案 3 :(得分:0)
所以,你的前提是错误的,你根本不需要释放你的“数据”,如果你这样做,它很可能会导致崩溃。您只应针对来自free
的数据致电malloc
,而"abc"
不是其中之一。
其次,如果您使用的是C,那么您应该这样做:
char *data = malloc(4);
strcpy(data, "abc");
...
free(data);
在C ++中,我们也无法将void *
[返回值从malloc
]转换为char *
,因此您需要char *data = (char *) malloc(4);
,但free(data)
应该仍然有效。一些编译器可能会为此发出警告,例如,标准MISRA不允许任何C类型的自动转换,因此这里需要显式强制转换[不是因为语言这样说,而是因为MISRA标准有,并且有“检查软件”,其中包含读取源代码以检查这些标准的情况。]
当然,在“新鲜”[1] C ++中,我们不应该使用malloc
或free
,而应使用new
和delete
:
char *data = new char[4];
strcpy(data, "abc");
....
delete [] data;
[1]如“从头开始编写为C ++的代码”。