Comment créer une chaîne std :: directement à partir d'un tableau char * sans copier?
Dire que j'ai un tableau de caractères, que j'ai alloué sur le tas, et que je veux convertir en un std::string. Actuellement, je suis en train de faire les suivants:
char *array = new char[size];
WriteIntoArray(array, size);
std::string mystring(array);
delete[] array;
return mystring; //or whatever
De ce que j'ai lu sur internet (http://www.cplusplus.com/reference/string/string/string/), la chaîne constructeur effectue une copie de la mémoire tampon je le passe, me laissant libre de la mémoire tampon (plus tard, la chaîne libère la mémoire tampon interne). Ce que je voudrais faire est de consacrer mon mémoire tampon, le transfert de contrôle de la chaîne, et puis de libérer mon tampon lorsqu'elle est détruite.
La question l'initialisation de std::string à partir de char* sans copie avait l'air prometteur, mais mon code s'appuie sur les appels d'API ("WriteIntoArray" dans l'exemple ci-dessus) qui ont à écrire dans un tableau de caractères, donc je dois créer un style C char* buffer, et ne peut pas convertir mon code à utiliser uniquement intégré dans les opérations de la chaîne (qui était la réponse suggérée).
Est-il un moyen standard pour ce faire, ou devrais-je écrire ma propre classe string (pouah)? Merci!
source d'informationauteur fyhuang
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez une conformation de C++0x mise en œuvre, ou l'une des nombreuses bibliothèques C++ que la garantie de stockage contigu pour
std::string
alors vous pouvez obtenir unechar*
qui pointe directement vers l'espace de stockage utilisé par votrestd::string
.Par exemple:
Vous pourriez avoir à réfléchir sur un terminateur null, cependant.
Vous pouvez mettre en place votre propre std::allocator qu'au lieu d'allouer de mémoire pour votre chaîne, utilise comme la source de la région que vous avez déjà instancié.
Vous devez ensuite instancier votre std::string à l'aide de votre allocation.
http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement
Vous ne pouvez pas std::string possède le pointeur et donc copie les données dans un espace qu'il alloue.
Ce que vous pourriez faire est: