当我使用它时,从堆上分配的内存中删除std :: string的最佳方法是什么?谢谢!
答案 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
是没有意义的,并且,当您需要时,仍然应该将这样的指针封装在智能指针中以避免内存泄漏的风险(在异常情况,多个返回路径,......)。
实际上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,我不建议在大多数情况下使用new
和delete
。如果需要在堆上分配字符串,请使用std :: shared_ptr来包装它:
std::shared_ptr<std::string> my_string = std::make_shared<std::string>(std::string("My string"));
只要my_string
的所有副本都超出范围,相关的内存就会自动删除。