使用后是否需要为临时字符串值赋值?

时间:2014-07-06 03:18:04

标签: c++ string

说我有一段这样的代码:

else if (array[z] == 1){
                string buf = string("00010");
                barzip += buf;
                string buf = string(NULL);

            }

为buf分配NULL是多余的,因为我要在下一个else if语句中重用字符串变量吗?谢谢!

3 个答案:

答案 0 :(得分:1)

这是多余的。实际上,字符串buf将在块的末尾超出范围,因此将调用buf析构函数。

else if (array[z] == 1)
{
  string buf = string("00010");
  barzip += buf;
  buf = string(NULL);  // second declaration would not compile.    
}

应该只是

else if (array[z] == 1)
{
  string buf("00010");
  barzip += buf;
  // buf goes out of scope here; destructor is called. 
  // Each iteration through the block will use a newly-constructed buf variable
}

答案 1 :(得分:0)

你不需要这样做。变量buf的范围仅在if语句的else分支中。如果没有运行该代码,则永远不会创建buf。此外,如果在循环中运行相同的代码,那么每次都是一个新的buf,因为一旦你离开其他分支,那么就忘记了buf。

另请注意,您可以这样做:

string buf("00010");

而不是:

string buf = string("00010");

答案 2 :(得分:0)

首先,

string buf = string("00010");
barzip += buf;
string buf = string(NULL);

将无法编译,因为您试图在同一个块中声明两个具有相同名称(buf)的变量。

其次,你不是在任何地方分配 NULL。您正在使用NULL 初始化一个未命名的临时字符串。这是未定义的行为,这意味着程序运行时可能会发生任何事情。

如果您很幸运,它会立即崩溃,以向您显示代码中存在错误。如果你不幸运,它不会崩溃,也不会对你执行程序的前20次做任何有害的事情,并且在第21次尝试时崩溃,导致无休止的追捕。

在非法初始化之后,你在技术上确实为buf分配了未命名的临时字符串,但由于此时行为尚未定义,因此无需再进行推理。

您似乎拥有C背景,并且习惯于手动处理char指针。在C ++中,最好从概念上处理std::string对象,就像内置的非指针类型一样。当int不再使用时,你会“清除”它吗?当然,你没有。在为其分配新值之前,您是否“清除”double?再说一遍,你没有。所以不要用std::string尝试这样的事情。它没有意义。