C++ nouveau & supprimer et string & fonctions
Bon, précédente question a été répondu clairement, mais j'ai découvert un autre problème.
Ce que si je fais:
char *test(int ran){
char *ret = new char[ran];
//process...
return ret;
}
Et ensuite l'exécuter:
for(int i = 0; i < 100000000; i++){
string str = test(rand()%10000000+10000000);
//process...
//no need to delete str anymore? string destructor does it for me here?
}
Donc, après la conversion du char* string, je n'ai pas à vous soucier de la suppression de plus?
Edit: Comme réponse, je delete[]
chaque new[]
appel, mais sur mon cas, ce n'est pas possible puisque le pointeur s'est perdu, donc la question est: comment puis-je convertir char à chaîne correctement?
- Re: Modifier... Ou de ne pas perdre le pointeur (comme par ma réponse ci-dessous) ou (mieux encore) de ne pas
new
le pointeur, il suffit d'utiliserstd::string
pour contenir la chaîne. Pourquoi voulez-vous faire de l'allocation de mémoire vous-même?
Vous devez vous connecter pour publier un commentaire.
Ici, vous n'êtes pas conversion la
char*
à un[std::]string
, mais copie lachar*
à un[std::]string
.En règle générale, pour chaque
new
il devrait y avoir undelete
.Dans ce cas, vous aurez besoin de stocker une copie du pointeur et
delete
lorsque vous avez terminé:char*
àstd::string
, ce que signifie que vous devez vous utilisationstd::string
plutôt quechar*
, pas de conversion par programmation.char*
lorsque vous stockez unestring
. Vous pourrait emploient des Pointeurs Intelligents, mais c'est une toute nouvelle boîte de pandore que je ne suis pas prêt pour l'ouvrir dès maintenant.return string( ran, 'a' )
. Jetez un oeil à la chaîne des constructeurs cplusplus.com/reference/string/string/stringVous semblent être sous l'impresison que l'adoption d'un
char*
en std::string transfère la propriété de la mémoire allouée. En fait, il fait juste une copie.La façon la plus simple de résoudre ce problème est de simplement utiliser un std::string tout au long de l'ensemble de la fonction et de le retourner directement.
Oui, oui, vous l'avez.
Si vous utilisez linux/os x, regarder dans quelque chose comme valgrind qui peut vous aider avec des problèmes de mémoire
Vous pouvez modifier votre fonction de test de sorte qu'elle retourne un
string
au lieu dechar *
, de cette façon, vous pouvezdelete [] ret
dans la fonction test.OU vous pouvez simplement utiliser une chaîne de caractères de test et de ne pas avoir à vous soucier de new/delete.
Vous doit appel
delete
pour chaquenew
sinon, vous aurez une fuite de mémoire. Dans le cas où vous avez montré que vous êtes de jeter le pointeur, si vous devez quitter la fonction renvoie unchar*
alors vous aurez besoin d'utiliser deux lignes pour créer lestd::string
de sorte que vous pouvez conserver une copie de l'char*
àdelete
.Une meilleure solution serait de réécrire votre
test()
fonction pour renvoyer unestd::string
directement.Vous avez besoin de faire quelque chose comme ceci:
Cela supprime la répartition de la char-tableau correctement.
Par la manière, vous devriez toujours zéro à la fin d'une chaîne si vous créez de cette façon (c'est à dire à l'intérieur de la fonction
test
), sinon, certaines fonctions peuvent facilement obtenir "confus" et de traiter les données au-delà de votre chaîne d'elle, qui, dans le meilleur des cas, des plantages de votre application, et dans le pire des cas de la création d'un silencieux débordement de la mémoire tampon conduisant à un comportement indéterminé à un moment plus tard, ce qui est le summum de débogage cauchemar... 😉