首页 > 解决方案 > 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 包含一个指向字符串“First string”的指针(字符串的实际内容当然位于堆上)。

现在,当我调用 set_string() 函数时,我假设我只是在覆盖指针。但是,由于我没有破坏实际的字符串对象,因此没有调用析构函数,因此我遇到了内存泄漏。那是对的吗?:)

标签: c++

解决方案


不它不是。std::string被设计成在内部处理它的内存——而且是正确的,即它会在需要分配一个新缓冲区的任何时候释放(删除)内部字符串缓冲区。

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

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


推荐阅读