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

时间:2018-05-28 20:33:09

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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