Comment copier le contenu de std::vector pour c-style de tableau statique,en toute sécurité?
J'ai besoin de manipuler des données dans le tableau fixe impliquant milieu d'insertion.
Plutôt que d'utiliser memcpy,etc. Je veux utiliser le vecteur. J'ai un problème quand je veux
pour copier les éléments du vecteur de retour à la c-gamme de style.
Voici le code:
void tryvector()
{
using namespace std;
const int MAX_SIZE=16;
BYTE myarr[MAX_SIZE]={0xb0,0x45,0x47,0xba,0x11,0x12, 0x4e};
vector<BYTE> myvec (myarr, myarr+MAX_SIZE);
vector<BYTE>::iterator it;
printf("myarr pre :");
for(int i=0;i<MAX_SIZE;++i){
printf("%02x ", myarr[i]) ;
}
printf("\nmyvec pre :")
for(it=myvec.begin(); it<myvec.end();++it){
cout<<hex<<static_cast<int>(*it)<<" ";
}
it = myvec.begin()+ 3;
myvec.insert(it,0x5f);
printf("\nmyvec post:");
for(it=myvec.begin(); it<myvec.end();++it){
cout<<hex<<static_cast<int>(*it)<<" ";
}
copy(myvec.begin(), myvec.end(), myarr); //???
printf("\nmyarr post:");
for(int i=0;i<MAX_SIZE;++i){
printf("%02x ", myarr[i]) ;
}
}
Je suis avec vs 2005.
Voici l'avertissement:
warning C4996: 'std::_Copy_opt' was declared deprecated
1> c:\program files\microsoft visual studio 8\vc\include\xutility(2270) : see declaration of 'std::_Copy_opt'
1> Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
1> c:\documents and settings\mhd\my documents\tesvector.cpp(50) : see reference to function template instantiation '_OutIt std::copy<std::_Vector_iterator<_Ty,_Alloc>,BYTE*>(_InIt,_InIt,_OutIt)' being compiled
1> with
1> [
1> _OutIt=BYTE *,
1> _Ty=BYTE,
1> _Alloc=std::allocator<BYTE>,
1> _InIt=std::_Vector_iterator<BYTE,std::allocator<BYTE>>
1> ]
Quand je le lance , j'ai eu l'erreur d'exécution suivant:
Run-Time Check Failure #2 - Stack around the variable 'myarr' was corrupted.
Veuillez noter que j'utilise le vecteur lieu de la liste ou deque parce que
le milieu d'insertion", comme le code ci-dessus est juat un problème particulier.
Il va se passer moins de "mise en place à la fin" et
'accès aléatoire de l'élément".
Toute solution ?
Une réponse qui ressemble à:"Vous utiliser c++, baisse de la c gamme de style de mise en œuvre.
Utilisez uniquement des vecteur pour l'ensemble de la matrice de mise en œuvre" n'est pas vraiment utile.
Grâce.
OriginalL'auteur mhd | 2009-03-11
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes en train d'ajouter des choses au vecteur de sorte qu'il se retrouve avec plus d'éléments que dans le
myarr
tableau que vous avez initialisé avec.Si vous souhaitez copier le vecteur de retour dans le tableau, vous aurez besoin de la taille vers le bas:
Ou vous pourrait limiter le nombre d'éléments que vous le copie:
Si vous voulez le
myarr
tableau pour contenir tous les éléments, alors il doit être plus grande queMAX_SIZE
, et que vous avez trouvé pourquoi les gens suggèrent d'utiliservector
plutôt que brut tableaux (vector
s savoir grandir, les tableaux ne sont pas).Noter que, si vous ne voulez pas " Toute réponse qui ressemble à:"Vous utiliser c++, baisse de la c gamme de style de mise en œuvre. Utilisez uniquement des vecteur pour l'ensemble de la matrice de mise en œuvre"", vous pouvez souvent obtenir loin avec l'aide d'un
vector
et en passant&myvec[0]
de routines que s'attendre à une crue de tableau.vector
est nécessaire pour stocker ses éléments de manière contiguë comme une brute tableau justement pour cette raison.Puisque vous êtes l'obtention de la "dangereux" attention, vous êtes à l'aide de Microsoft du compilateur. Pour résoudre le problème en toute sécurité, vous êtes censé utiliser le
checked_copy
algorithme au lieu decopy
. Comme Evgeny Lazin indique, vous pouvez créer un contrôle itérateur sur votre tableau de passer à lachecked_copy
algorithme.D'autres options pour effectuer la copie de sécurité qui ne nécessitent pas d'extensions Microsoft serait pour envelopper le tableau dans une classe (éventuellement de type "modèle") qui assure le suivi de la taille de la matrice et fournit des méthodes pour copier les données dans le tableau de façon sécuritaire. Quelque chose comme STLSoft
array_proxy
modèle ou Du coup de pouceboost::array
pourrait aider.Cela semble œuvres, mais l'avertissement est toujours là. Est ce que ça va?
notez que maintenant avec c++11, il est également std::array
OriginalL'auteur Michael Burr
En général, je suppose que vous pourriez faire quelque chose comme ceci:
Ce alloue un nouveau style C tableau pour contenir le vecteur des éléments, et copie les données en place. De cette façon, le il n'est pas nécessaire de faire correspondre les tailles de manière statique.
Bien sûr, c'est le général de sorte qu'il vous donne juste un
void *
pour accéder à votre C tableau avec, de sorte que vous devez soit jetés ou tout simplement de changer le type de type réel (BYTE
dans ce cas).Vous devez utiliser de new/delete[] à la place de malloc/free en C++
OriginalL'auteur unwind
Vous pouvez utiliser l'argument de modèle de déduction pour trouver le tableau lié:
Désactiver Microsoft avertissements sur décoché des trucs. Ils sont destinés à vous attirer dans l'écriture de portables code.
Voir la référence à la "Sécurité Standard C++ Library" dans l'avertissement, qui n'est PAS un standard. L'idée derrière ce concept n'est pas mauvais, mais ils ont été constants dans le nommage. E. g. stdext::checked_iterator /est/ bien nommé.
OriginalL'auteur MSalters
Que vous pouvez faire:
Edit: autant Que la sécurité va, selon cette, vecteurs de stocker des données dans des segments contigus de la mémoire, de sorte que vous pouvez accéder à leur "non seulement à l'aide des itérateurs, mais aussi en utilisant des décalages régulier sur les pointeurs vers des éléments."
Oui, il corrige la compilation-la question du temps.
Aussi garder à l'esprit qu'il n'est pas sûr de prendre l'adresse de [0] d'un vecteur s'il est vide. La plus récente VC++ runtime aura fort à plaindre à ce sujet (et à juste titre, à mon humble avis).
Vous supposez que sizeof(BYTE) est de 1. Je sais intatively il devrait être, mais pas une hypothèse que je voudrais compter sur.
Eh bien, je ne sais pas ce que l'OCTET (je ne fais pas de Windows), mais par définition, sizeof(char) == 1 en C++.
OriginalL'auteur i_am_jorf