2010-04-29 5 views
1

J'ai besoin de stocker une certaine quantité de données dans le "char *" en C++, car je veux éviter que std :: string manque de mémoire, en dépassant max_size(). Mais les données viennent dans les blocs de données du réseau, donc je dois utiliser la réaffectation chaque fois que je reçois le bloc de données. Existe-t-il une solution élégante pour la réaffectation et la concaténation de char * en C++?Char * reallocation en C++

+7

Je ne comprends pas ce que vous dites à propos de 'std :: string' à court de mémoire . Si vous utilisez autant de mémoire, vous aurez besoin de corder les choses ensemble. Sinon, ne gardez pas la corde quand vous en avez fini. – GManNickG

+2

Avez-vous des preuves que 'std :: string' ne peut pas être utilisé pour accomplir ceci? –

Répondre

2

Vous pouvez utiliser la méthode C et utiliser malloc()/realloc(), mais realloc() va juste allouer un nouveau bloc, copier l'ancien dans le nouveau fichier, et libérer le vieux bloc parfois de toute façon. En outre, il est difficile à utiliser correctement.

Vous pouvez simplement allouer un tampon énorme et/ou le développer exponentiellement, ce qui compense la gravité du problème. Vous pouvez également utiliser ropes.

+0

"Vous pourriez juste allouer un énorme tampon et/ou le développer exponentiellement, ce qui compense la gravité du problème." <- Note: La plupart des implémentations 'std :: string' le font déjà. –

+0

@Billy - Ce n'est pas surprenant. Je me demande si l'OP sait qu'il va avoir des problèmes d'allocation ou s'il optimise prématurément. –

+0

Habituellement, realloc n'aura à copier que s'il n'y a pas de place dans l'espace mémoire après le bloc (et, bien sûr, cela dépend entièrement de l'implémentation mais tous ceux que j'ai lus (et ceux que j'ai écrits) optimisent pour ce cas). – paxdiablo

1

std: vecteur vient à l'esprit pour l'allocation automatique de la chaîne croît en taille. Allouez juste un Vector<char> et des caractères push_back() au contenu de votre coeur.

+2

Ce ne sera pas différent de 'std :: string' 99% du temps, que l'OP dit qu'il veut explicitement éviter. –

3

Dans Visual Studio, max_size() correspond à 4294967294 caractères, soit environ 4 Go. Il serait intéressant si vous pouviez nous dire comment vous courez le risque de dépasser ce nombre de caractères.

Si le problème ne surgissent souvent, ce qui est seulement de faire échouer la sécurité alors

myConcatStr(string str1, string str2) 
{ 
     if (str1.length() + str2.length()) <= str1.max_size() // if there is no overflow problem 
      str1.append(str2); // use stl append 
     else 
      //use alternate method instead or throw an exception 
} 
+1

Err .. qui est 4GiB, pas 8. –

+1

pas un 'string' (' sizeof (char) 'est 1 par définition). Pour un 'wstring', la taille de l'élément peut être 2. –

+0

mybad, édité ... – aCuria