как правильно освободить std :: string из памяти

<p>каков наилучший способ удалить std :: string из памяти, выделенной в куче, когда я использую ее? спасибо!</p>

<p><code>std::string</code> это просто нормальный класс<sup>1</sup>так что применяются обычные правила.</p><p>если вы размещаете объекты <code>std::string</code> в стеке, как глобальные, как члены класса, ... вам не нужно делать ничего особенного, когда они выходят из области видимости, вызывается их деструктор, и он заботится об освобождении памяти, используемой для строка автоматически.</p><pre><code>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 } </code></pre><p>единственный случай, когда вам нужно что-то сделать, это когда вы выделяете <code>std::string</code> в куче с помощью оператора <code>new</code>; в этом случае, как и для любого объекта, выделенного с помощью <code>new</code>, вы должны вызвать <code>delete</code>, чтобы освободить его.</p><pre><code>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; } </code></pre><p>как подразумевается в примере, в общем случае бессмысленно выделять <code>std::string</code> в куче, и, когда вам это нужно, вы все равно должны инкапсулировать такой указатель в интеллектуальный указатель, чтобы избежать даже утечек памяти (в случае исключений - несколько путей возврата). ...).</p><hr /><ol> <li><p>на самом деле <code>std::string</code> определяется как</p> <pre><code>namespace std { typedef std::basic\_string<char> string; }; </code></pre> <p>так что это синоним для создания экземпляра класса шаблона <code>basic\_string</code> для символов типа <code>char</code> (это ничего не меняет в ответе, но в so вы<em> должны </em>педантичны даже в вопросах новичка).</p></li> </ol>

<pre><code>std::string foo("since it's on the stack, it will auto delete out of scope"); </code></pre><p>или же:</p><pre><code>std::string* foo = new std::string("allocated on the heap needs explicit destruction") delete foo; </code></pre>

<p>используйте <code>delete</code>, если он в куче, и вообще ничего, если он в стеке.</p>

<pre><code>void foo() { string* mystring = new string("heap-allocated objects are deleted on 'delete mystring;'"); cout << *mystring << endl; delete mystring; } </code></pre><p>или еще лучше, по возможности избегайте указателей и используйте автоматические переменные:</p><pre><code>void foo() { string mystring("stack-allocated string is automatically deleted when mystring goes out of scope"); cout << mystring << endl; } </code></pre>

<p>вы можете обращаться с <code>std::string</code> как с любым другим классом. используйте <code>new</code> для выделения и <code>delete</code>, как только вы закончите с ним . в c++ 11 я не рекомендую использовать <code>new</code> и <code>delete</code> в большинстве случаев. если вам нужно разместить строку в куче, используйте std :: shared\_ptr, чтобы обернуть ее:</p><pre><code>std::shared\_ptr<std::string> my\_string = std::make\_shared<std::string>(std::string("my string")); </code></pre><p>как только все копии <code>my\_string</code> выйдут из области видимости, соответствующая память будет автоматически удалена.</p>

<p>просто относитесь к std :: string как к любому основному типу.</p><pre><code>std::string *str = new std::string("whatever"); ///code delete str; </code></pre>