Conversion (void *) en std :: vector & lt; unsigned char & gt;
J'ai un (void*)
tampon que j'ai besoin de les convertir à std::vector<unsigned char>
avant que je puisse le transmettre. Malheureusement, mon C++ casting des compétences un peu faible. Des suggestions?
source d'informationauteur Mike Douglas
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de la longueur de la mémoire tampon. Une fois que vous faites, nous pouvons le faire:
Bon, le commentaire qui m'a sur pourquoi je n'ai pas utilisé
reinterpret_cast
:Le problème avec le style C cast est: la flexibilité supplémentaire peut causer des chagrins d'amour lorsque le pointeur de changement de type.
Remarque: je suis d'accord avec la convention générale de casting pas comme beaucoup que possible. Cependant, sans aucune source, c'est le mieux que je puisse faire.
Vous ne devriez pas faire de casting - l'arrêt complet. S'il vous plaît poster un code qui illustre à votre question, je ne comprends vraiment pas ce que tu veux dire par "(void*) buffer".
Vous ne pouvez pas simplement jeter un
void*
à unstd::vector<unsigned char>
parce que la disposition de la mémoire de ce dernier inclut d'autres objets, tels que la taille et le nombre d'octets actuellement alloués.En supposant que la mémoire tampon est pointé par
buf
et sa longueur est den
:permettra de créer un copie de la mémoire tampon que vous pouvez utiliser en toute sécurité.
[EDIT: Ajout de
static_cast<char*>
ce qui est nécessaire pour l'arithmétique des pointeurs.]Le seul moment que ce serait légitime est de savoir si vous aviez déjà créé un vecteur, et voulait simplement récupérer.
Je n'ai même pas essayé de voir si cela va fonctionner, mais c'est l'esprit. Cela dit, si vous faites cela à partir de zéro, vous êtes certainement de faire le mal. C'est vraiment mauvais. Le seul temps que cela pourrait être, même à distance est compréhensible si vous êtes contraint de mettre en œuvre la déjà défini "SomeFunc()".
en utilisant std::vector classe pour un tampon déjà alloué n'est pas une solution. Un std::vector objet gère la mémoire et libère à la destruction du temps.
Compliqué solution pourrait être d'écrire votre propre allocateur, qui utilise un tampon déjà alloué, mais vous devez être très prudent sur plusieurs scénarios, comme vecteur de redimensionnement, etc.
Si vous avez que le void* buffer lié par le biais de certaines fonctions de l'API C, alors vous pouvez oublier la conversion à std::vector.
Si vous avez seulement besoin d'une copie de la mémoire tampon, il peut être fait comme ceci:
où bufferSize est la taille en caractères copiés de la mémoire tampon.