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

lic*_*hgo 0 c c++

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

char *data = "abc";
free( (void*)data );
Run Code Online (Sandbox Code Playgroud)

只有两个问题:

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

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

非常感谢.

unw*_*ind 6

不,这是没有必要的; 该free()呼叫是错误的,你不能做到这一点.

演员是一个巨大的眨眼,弹跳和尖叫的警告标志,原始程序员感到困惑.

将未被前一次调用返回的指针传递给malloc()它或其中一个朋友,这是未定义的行为free().演员阵容是这里最少的问题.

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

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

data = NULL;
Run Code Online (Sandbox Code Playgroud)

虽然不会以任何方式"释放"幕后使用的内存来保存角色数据"abc",但这很好.