我有一个c ++类,其成员是一个字符串,如:
class Phone {
string name;
void foo()
{
name = string("new_name");
}
}
现在,在函数“foo”中,我将字符串重新分配给“new_name”。我的问题是:
答案 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”?
取决于。如果您正在使用初始化程序列表,那么它就不一样了。没有任务;只调用复制构造函数。