char * data =“abc”; free((void *)data);为什么无效*转换?有必要吗?

时间:2014-06-11 07:49:18

标签: c++ c

有一个C风格的字符串,我需要释放它的记忆。我看到了以下代码示例,但对于为什么(void*)感到困惑。

char *data = "abc";
free( (void*)data );

只有两个问题:

  1. 为什么不简单地free(data)

  2. (void*)转换是必须的吗?

  3. 非常感谢。

4 个答案:

答案 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 ++中,我们不应该使用mallocfree,而应使用newdelete

char *data = new char[4];
strcpy(data, "abc");
....
delete [] data;

[1]如“从头开始编写为C ++的代码”。