gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:45:59 30 4
gpt4 key购买 nike

假设我有这个设置:

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

最佳答案

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

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

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

关于C++何时调用字符串析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573134/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com