让我说我有这个设置:
struct My_Struct_T
{
//some stuff
string my_string;
//some other stuff
}
My_Struct_T myVar = {};
string Set_String()
{
string res = "Second String";
return res;
}
void Foo()
{
myVar.my_string = "First String";
//do some stuff
//do i have a memory leak after this line?
myVar.my_string = Set_String();
}
起初myVar包含一个指向字符串的指针"第一个字符串" (当然,字符串的实际内容位于堆上)。
现在,当我调用set_string()函数时,我想我只是覆盖指针。但是,由于我没有破坏实际的字符串对象,因此没有调用析构函数,因此我得到了内存泄漏。 那是对的吗? :)
答案 0 :(得分:2)
不,不是。 std::string
旨在内部处理其内存 - 正确地说,我。即它会在需要分配新内存时释放(删除)内部字符串缓冲区。
高效的实现甚至尝试尽可能长时间地重用内部缓冲区(即,分配新内容只会覆盖旧的内容在同一个位置,如果它适合)。
请注意,分配字符串文字或任何其他char(const)指针将导致std::string object
将分配的数据复制到某个内部缓冲区中,这尤其意味着它赢得了#39 ; t取得指针的所有权。如果您new
数组,则会出现内存泄漏,请将其分配给std::string
,之后不要delete
...
答案 1 :(得分:1)
不,将在临时调用赋值运算符,这将被销毁。