web-dev-qa-db-fra.com

Comment libérer correctement un std :: string de la mémoire

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!

33
IDWMaster

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). , ...).


  1. 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).

61
Matteo Italia
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;
6
The Communist Duck

Utilisez delete si c'est sur le tas et rien du tout si c'est sur la pile.

4
Oliver Charlesworth
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;
}
1
Lie Ryan

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.

0
user4580891

traitez simplement std :: string comme n'importe quel type de base.

std::string *str = new std::string("whatever");
///code
delete str;
0
yu quan