重新分配C ++字符串,是否正确释放旧字符串?

时间:2010-08-30 14:52:53

标签: c++ string constructor free

我有一个c ++类,其成员是一个字符串,如:

class Phone {
string name;

void foo()
  {
    name = string("new_name");
  }
}

现在,在函数“foo”中,我将字符串重新分配给“new_name”。我的问题是:

  • 旧的空字符串怎么了?它被正确地“释放”了吗?它还会占用记忆吗?
  • 现在我将Phone的构造函数中的字符串初始化为string(“old_name”)。这与之前的空字符串是一样的吗?旧字符串“old_name”在这里会发生什么?

4 个答案:

答案 0 :(得分:7)

是的,std::string为您管理记忆。 (这是它存在的原因之一!)它是如何做的实现细节(例如,它可能使用写时复制,引用计数或深度复制语义),但在大多数情况下,{{1}如果不再需要,它将始终正确释放内存。

当然,这假设在赋值运算符的实现或std::string的析构函数中没有错误(对于实现非默认赋值运算符/析构函数的所有类都是如此)。 / p>

答案 1 :(得分:3)

如果它是std::string我们正在讨论的话那么一切都被正确释放了。

然而,真正发生的事情取决于实施。几个std :: string实现使用某种形式的引用计数,因此它依赖于实现。

另请注意,您的代码与:

相同
name = "new_name";

......甚至更明确地说:

name.assign( "new_name" );

答案 2 :(得分:1)

  • 假设正确编写赋值运算符,将调用析构函数。
  • 假设正确编写了析构函数,则释放使用的内存。

答案 3 :(得分:1)

  

旧的空字符串会发生什么?它被正确地“释放”了吗?它仍然占据记忆吗?

它通常不应占用太多内存(只要你没有初始化它)。在赋值时,字符串可以重新分配给。你正在做的是:

  • 创建临时字符串对象,在;
  • 分配结束后,该对象将被释放
  • 使用此临时文件复制构造新字符串,然后将其设置为原始name变量。

任何内存重新分配都将正确释放原始内存。注意:编译器可能会也可能不会根据您的设置优化某些步骤。

  

现在我初始化了字符串   电话的建设者   字符串( “OLD_NAME”)。这是一样的吗?   案例与之前的空字符串一样?   旧字符串在这里会发生什么   “OLD_NAME”?

取决于。如果您正在使用初始化程序列表,那么它就不一样了。没有任务;只调用复制构造函数。