Envoyé par
zuzuu
Justement, il semble que ce soit le seul moyen de pouvoir enregistrer bit à bit (ou octet par octet) les données et les récupérer ensuite pour reconstituer la structure d'origine.
Outre ce qu'à déjà précisé Loïc sur les contraintes de la structure pour garantir un memcpy 'brut' en C++, je voudrais juste rappeler qu'une bête sérialisation octet par octet pour transporter des données doit tenir compte (en C++ comme en C) des problèmes d'alignements, de boutisme, de taille des types et j'en oublie certainement.
Je crois que si tu peux tu devrais suivre le conseil de bacelar et opter pour une bibliothèque qui propose de la sérialisation en C++.
Sinon, sur le code que tu as posté :
1 2 3
| void * l_val = new void*;
// set the obj in l_val
Get(l_val); |
ici tu alloue un pointeur sur void. Donc (en supposant que tu as des adresses sur 32 bits), tu alloues 4 octets seulement.
Que fait Get ? S'il se contente de positionner l'adresse de l_val, alors l'allocation est inutile. S'il copie des données vers l'adresse pointée par l_val, alors tu auras souvent des débordements.
int * l_beginMem = (int *)l_val + (l_countInstance * l_sizeObj);
En appliquant l'arithmétique des pointeurs, cette ligne ne déplace pas l_val de l_countInstance * l_sizeObj octets mais de (l_countInstance * l_sizeObj)*sizeof(int) octets puisque tu cast l_val en int*.
Et bien sur il en va de même pour la variable suivante.
Donc ta ligne bleu pose bien problème mais c'est probablement toute ta sérialisation qui risque de partir dans les choux.
Partager