2010-10-24 82 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