C++何时调用字符串析构函数



假设我有这个设置:

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(( 函数时,我假设我只是覆盖了指针。但是,由于我没有破坏 acutal 字符串对象,因此没有调用析构函数,因此我得到了内存泄漏。 这是对的吗?:)

不,不是。std::string旨在内部处理其内存 - 并且正确,即每当需要分配新字符串缓冲区时,它都会释放(删除(内部字符串缓冲区。

高效的实现甚至尝试尽可能长时间地重用内部缓冲区(即分配新内容只是覆盖同一位置的旧内容,如果它适合的话(。

请注意,分配字符串文本或任何其他字符 (const( 指针将导致std::string object将分配的数据复制到某个内部缓冲区中,这尤其意味着它不会获得指针的所有权。如果您new一个数组,将其分配给std::string并且之后不delete它,则会出现内存泄漏......

不,临时调用赋值运算符,该运算符将被销毁。

最新更新