说我有一段这样的代码:
else if (array[z] == 1){
string buf = string("00010");
barzip += buf;
string buf = string(NULL);
}
为buf分配NULL是多余的,因为我要在下一个else if
语句中重用字符串变量吗?谢谢!
答案 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
尝试这样的事情。它没有意义。