Char *data = "abc";释放((void*)data);为什么是void*转换?有必要

char *data = "abc"; free( (void*)data ); Why void* conversion? Is it necessary?

本文关键字:void quot data 转换 为什么 abc 释放 Char      更新时间:2023-10-16

有一个c风格的字符串,我需要释放它的内存。我看到了下面的代码示例,但对(void*)在那里的原因感到困惑。

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

就两个问题:

  1. 必须转换(void*)吗?

许多谢谢。

不,没有必要;free()调用是错误的,您不能这样做。

cast是一个巨大的闪烁、跳跃和尖叫的警告标志,表明最初的程序员感到困惑。

将先前调用malloc()free()的友端没有返回的指针传递给CC_6是未定义的行为。演员阵容是这里最小的问题。

您永远不能"释放"字符串字面值使用的内存,因为该内存永远不会以程序控制的某种方式分配。它不在堆上,堆是动态内存分配/释放通常发生的地方。你的意图是错误的。

你所能做的就是将指针设置为NULL:

data = NULL;

不会以任何方式"释放"用于保存字符数据"abc"的内存,但这很好。

调用free()是错误的,因为没有使用(m/c/re)alloc分配。

正如Jens Gustedt指出的那样,只有在传递const指针时才需要强制转换,因为free()接受void *,而不是const void *:

const int *x = malloc(sizeof(int));
free((void *)x);

如果没有cast,你会得到:

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 *’

不需要强制转换。在C语言中,void*可以隐式地转换为其他指针类型。free需要一个void*,所以不需要从其他指针类型强制转换。

(当然,正如已经指出的,这段代码显然是有问题的,所以不要读得太多。)

所以,这里的前提是不正确的,您根本不需要释放您的"数据",如果您这样做,很可能会导致崩溃。对于来自malloc的数据,您应该只调用free,而free(data)0不是其中之一。

第二,如果你使用的是C语言,那么你应该这样做:
char *data = malloc(4);
strcpy(data, "abc");
...
free(data);

在c++中,我们也不能将void *[从malloc返回的值]转换为char *,所以你需要char *data = (char *) malloc(4);,但free(data)应该仍然可以工作。一些编译器可能会对此发出警告,例如,标准的MISRA不允许任何C类型的自动转换,所以这里需要显式强制转换[不是因为语言这样说,而是因为MISRA标准这样做,并且有"检查软件"读取源代码以检查这些标准是否满足]。

当然,在"fresh"[1] c++中,我们不应该使用mallocfree,而应该使用newdelete:

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

[1]即"从头开始用c++编写的代码"。