Quelle est la meilleure façon de supprimer un std :: string de la mémoire allouée sur le tas quand je l’ai fini? Merci!
std::string
est juste une classe normale1, donc les règles habituelles s'appliquent.
Si vous allouez des objets std::string
sur la pile, en tant que globales, en tant que membres de classe, ... vous n'avez rien de spécial à faire, quand ils sortent de leur portée, leur destructeur est appelé et il se charge de libérer la mémoire utilisée pour la chaîne automatiquement.
int MyUselessFunction()
{
std::string mystring="Just a string.";
// ...
return 42;
// no need to do anything, mystring goes out of scope and everything is cleaned up automatically
}
Le seul cas où vous devez faire quelque chose est lorsque vous allouez un std::string
sur le tas à l'aide de l'opérateur new
; dans ce cas, comme avec tout objet alloué avec new
, vous devez appeler delete
pour le libérer.
int MyUselessFunction()
{
// for some reason you feel the need to allocate that string on the heap
std::string * mystring= new std::string("Just a string.");
// ...
// deallocate it - notice that in the real world you'd use a smart pointer
delete mystring;
return 42;
}
Comme indiqué dans l’exemple, il est généralement inutile d’allouer un std::string
sur le tas et, si vous en avez besoin, vous devez encapsuler ce pointeur dans un pointeur intelligent pour éviter tout risque de fuite de mémoire (en cas d’exception, plusieurs chemins de retour). , ...).
En fait, std::string
est défini comme
namespace std
{
typedef std::basic_string<char> string;
};
c'est donc un synonyme pour l'instanciation de la classe de modèle basic_string
pour les caractères de type char
(cela ne change rien à la réponse, mais sur SO vous devez être pédant même sur des questions pour débutants).
std::string foo("since it's on the stack, it will auto delete out of scope");
ou:
std::string* foo = new std::string("allocated on the heap needs explicit destruction")
delete foo;
Utilisez delete
si c'est sur le tas et rien du tout si c'est sur la pile.
void foo() {
string* myString = new string("heap-allocated objects are deleted on 'delete myString;'");
cout << *myString << endl;
delete myString;
}
ou mieux encore, évitez si possible les pointeurs et utilisez des variables automatiques:
void foo() {
string myString("stack-allocated string is automatically deleted when myString goes out of scope");
cout << myString << endl;
}
Vous pouvez traiter std::string
comme n'importe quelle autre classe. Utilisez new
pour l'attribution, et delete
une fois que vous avez terminé . Avec C++ 11, je ne recommande pas l'utilisation de new
et delete
dans la plupart des cas. Si vous avez besoin d'allouer la chaîne sur heap, utilisez std :: shared_ptr pour l'envelopper:
std::shared_ptr<std::string> my_string = std::make_shared<std::string>(std::string("My string"));
Dès que toutes les copies de my_string
sortent de la portée, la mémoire associée sera automatiquement supprimée.
traitez simplement std :: string comme n'importe quel type de base.
std::string *str = new std::string("whatever");
///code
delete str;