2010-10-24 11 views

Répondre

15

Vous ne pouvez pas implicitement transtyper void * en C++ (contrairement à C à cet égard). Vous pourriez faire:

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

mais vraiment, vous devriez juste être en utilisant new/delete au lieu de malloc/free!

+5

Vous pouvez 'static_cast' partir de' void * ', et cela devrait probablement être le cas parce que' reinterpret_cast' va provoquer une panique inutile. –

+3

Il ne s'agit pas d'une situation pour reinterpret_cast <> que vous devez réserver pour des situations très spécifiques dans lesquelles vous souhaitez que les utilisateurs revérifient le code (en particulier lors du portage). –

+0

@Martin, @Steve: Vous avez tous les deux raison, réponse mise à jour ... –

2

Malloc renvoie un pointeur vide; Lorsque vous l'utilisez, vous devez convertir la valeur renvoyée en un pointeur vers le type de données que vous y stockez.

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

Seulement en C++. Et si vous êtes en C++, vous ne devriez pas utiliser de jets de style C ou de malloc de toute façon. –

1

En C++, il ne peut pas attribuer simplement un pointeur d'un type à un pointeur d'un autre type (comme toujours il y a exception à la règle. Il est par exemple valide pour attribuer un tout pointeur vers un vide . pointeur)

Ce que vous devez faire est de jeter votre pointeur vide à un pointeur uint8_t:

buffer = (uint8_t *) malloc (numBytes); 

note: Ceci est seulement nécessaire en C++, en C, il a été autorisé à mélanger et des pointeurs de match. La plupart des compilateurs C donnent un avertissement, mais c'est un code valide.

Puisque vous utilisez C++, vous pouvez également utiliser et d'en supprimer comme ceci:

buffer = new uint8_t[numBytes]; 

et se débarrasser de votre tampon à l'aide:

delete[] buffer; 

En général, vous ne devriez pas utiliser malloc et gratuit, sauf si vous devez vous interfacer avec des bibliothèques c.

+2

"En général, vous ne devriez pas utiliser malloc et free, sauf si vous devez". Vous ne devriez pas utiliser new [] et supprimer [] à moins d'y être obligé. 'vector' est correct presque tout le temps. –

+1

Et vous ne devriez pas non plus utiliser les transtypages de style c en C++. –