2010-10-24 138 views
4

我得到了这个问题无效的转换:C++:的malloc:错误:从 '无效*' 到 'uint8_t *'

invalid conversion from ‘void*’ to ‘uint8_t*’

做这件事时:

int    numBytes; 
uint8_t   *buffer; 

buffer=malloc(numBytes); //error here, why? 

或我必须把它是这样吗?

buffer=malloc(numBytes); 

请解释一下。

+0

请使用某种智能指针。 – GManNickG 2010-10-25 07:33:51

回答

15

您不能在C++中隐式地从void *强制转换(不像C在这方面)。你可以这样做:

buffer = static_cast<uint8_t *>(malloc(numBytes)); 

不过说真的,你应该只使用new/delete,而不是malloc/free

+5

你可以从'void *'调用'static_cast',如果只是因为'reinterpret_cast'会导致人们不必要地恐慌,可能应该这样做。 – 2010-10-24 23:08:42

+3

这不是reinterpret_cast <>的情况,你应该为非常特殊的情况保留你想要人们重新检查代码(尤其是移植时)的情况。 – 2010-10-24 23:33:54

+0

@Martin,@Steve:你是对的,回答更新... – 2010-10-25 07:29:24

2

Malloc返回一个void指针;当你使用它时,你必须将返回值转换为指向你存储在其中的任何数据类型的指针。

buffer = (uint8_t *) malloc(numBytes); 
+1

只限于C++。如果你使用C++,你不应该使用C风格的转换或malloc。 – 2010-10-25 00:08:21

1

在C++不允许简单地将一种类型的指针指定给其他类型的指针(总是有例外,它是例如有效的任何指针分配给空隙。指针)

你应该做的是你的空指针转换为一个uint8_t指针:

buffer = (uint8_t *) malloc (numBytes); 

注意:这是只需要在C++中,在C它允许混合和匹配指针。大多数C编译器会发出警告,但它是有效的代码。

由于您使用C++,你也可以使用new和delete是这样的:

buffer = new uint8_t[numBytes]; 

和使用摆脱你的缓冲区:

delete[] buffer; 

一般来说,你不应该使用malloc并免费,除非你必须与C库接口。

+2

“一般来说,除非必须使用,否则不应该使用malloc和free。”除非必须使用新的[]和删除[]。几乎所有的时间'vector'都能很好地工作。 – 2010-10-24 23:11:23

+1

而且你不应该在C++中使用c风格转换。 – 2010-10-25 00:07:58