如何从内存中正确释放std :: string

时间:2011-02-12 18:05:59

标签: c++ string

当我使用它时,从堆上分配的内存中删除std :: string的最佳方法是什么?谢谢!

6 个答案:

答案 0 :(得分:64)

std::string只是一个普通的类 1 ,所以适用通常的规则。

如果在堆栈上分配std::string个对象,作为全局变量,作为类成员,......你不需要做任何特殊的事情,当它们超出范围时,它们的析构函数被调用,并且它需要注意自动释放​​用于字符串的内存。

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
}

您必须执行某项操作的唯一情况是使用std::string运算符在堆上分配new时;在这种情况下,与分配有new的任何对象一样,您必须致电delete以释放它。

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;
}

正如示例所暗示的那样,一般来说,在堆上分配std::string是没有意义的,并且,当您需要时,仍然应该将这样的指针封装在智能指针中以避免内存泄漏的风险(在异常情况,多个返回路径,......)。


  1. 实际上std::string定义为

    namespace std
    {
        typedef std::basic_string<char> string;
    };
    

    所以它是basic_string类型char字符实例化的同义词(这不会改变答案中的任何内容,但是你必须 >即使是在新手问题上也要迂腐。)

答案 1 :(得分:6)

std::string foo("since it's on the stack, it will auto delete out of scope");

或:

std::string* foo = new std::string("allocated on the heap needs explicit destruction")
delete foo;

答案 2 :(得分:4)

如果它在堆上,则使用delete,如果它在堆栈中则不使用任何内容。

答案 3 :(得分:1)

void foo() {
    string* myString = new string("heap-allocated objects are deleted on 'delete myString;'");
    cout << *myString << endl;
    delete myString;
}

或者更好的是,尽可能避免使用指针并使用自动变量:

void foo() {
    string myString("stack-allocated string is automatically deleted when myString goes out of scope");
    cout << myString << endl;
}

答案 4 :(得分:0)

将std :: string视为任何基本类型。

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

答案 5 :(得分:0)

您可以像对待任何其他课程一样对待std::string。使用new进行分配,使用delete进行分配。 对于C ++ 11,我不建议在大多数情况下使用newdelete。如果需要在堆上分配字符串,请使用std :: shared_ptr来包装它:

std::shared_ptr<std::string> my_string = std::make_shared<std::string>(std::string("My string"));

只要my_string的所有副本都超出范围,相关的内存就会自动删除。