2010-10-15 24 views
0

Je souhaite copier des éléments d'un tableau struct vers un autre en utilisant memcpy. Je crois que c'est la cause lamentable de mon programme pour échouer pour une raison quelconque. Aussi, comment puis-je libérer la mémoire à la fin?C++ struct array copy

struct FaultCodes 
{ 
    string troubleFound; 
    string causeCode; 
    string actionCode; 
    string paymentCode; 
    string suppCode; 
    u_int16_t multiplier; 
}; 

struct JobFaultInfo 
{ 
    static const size_t NUM_CODES = 5; 
    FaultCodes codes[NUM_CODES]; 
}; 

FaultCodes codes[JobFaultInfo::NUM_CODES]; 
// I have populated codes with the data. 

JobFaultInfo info; 
memcpy(info.codes, codes, sizeof(FaultCodes)*JobFaultInfo::NUM_CODES); 

Répondre

6

Vous seulement autorisé à utiliser memcpy dans le cas où les objets que vous copiez sont dites PODs (structures de données pures et simples). Mais votre structure contient des objets std :: string qui ne sont pas des POD. Ainsi, votre structure entière n'est pas un POD.

Utilisez plutôt std :: copy dans l'en-tête de l'algorithme.

6

Un std::string contient généralement un pointeur vers l'emplacement où il stocke les caractères. En utilisant memcpy pour chaque chaîne, vous obtenez deux instances std::string qui pensent toutes les deux devoir libérer cette mémoire. Coup. Vous pouvez utiliser std::copy à partir de <algorithm> à la place.

Mais encore mieux, utilisez un std::vector au lieu d'un tableau brut.

Salutations & hth.

+0

merci beaucoup .. gee comment pourrais-je ne pas savoir que: P ... – nixgadgets

2

Au moment où vous entrez dans le domaine std ::, vous ne pouvez pas utiliser memcpy. En effet, tous les conteneurs std, y compris les chaînes, stockent les données dans un autre emplacement et ne conservent que les pointeurs de ces données. Donc, si vous faites simplement une copie bit à bit (comme dans memcpy), vous ne savez pas exactement ce que vous avez copié.
Comme suggéré au lieu d'utiliser les tableaux simples et memcpy utiliser les vecteurs et std :: copy respectivement. Ceux-ci n'auront pas l'avantage de la copie rapide comme le fait Memcpy mais il est beaucoup plus fiable que l'ancienne méthode.
Si vous voulez toujours coller avec memcpy alors comme je l'ai expliqué, vous ne pouvez pas utiliser de chaîne. Dans votre structure, vous aurez un tableau char en deux dimensions de la mémoire statique (pile). chat [5] [MAX_STRING_LEN]. Toutes les chaînes de vos structures doivent être mappées dans chacun des éléments de ce tableau. Maintenant, votre structure sera composée de données pures et pas de pointeur, et vous pouvez donc utiliser memcpy.
Mais s'il vous plaît ne faites pas cela, il suffit d'utiliser vecteur avec std :: copie.

+0

merci beaucoup. une très bonne explication en effet. J'ai déjà commencé à utiliser des vecteurs à la place. Je ne sais même pas pourquoi je suis allé sur le chemin de l'utilisation de tableaux: S ... – nixgadgets