是否有必要在使用临时字符串值后将其赋值为null ?

Is it necessary to assign null to a temp string value after using it?

本文关键字:赋值 null 字符串 是否      更新时间:2023-10-16

假设我有这样一段代码:

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

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

这是多余的。实际上,字符串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
}

您不需要这样做。变量buf的作用域仅在if语句的else分支中。如果该代码没有运行,则永远不会创建but。同样,如果同样的代码在循环中运行,它每次都是一个新的但是,因为一旦你离开else if分支,但是就被遗忘了。

还可以这样做:

string buf("00010");

代替:

string buf = string("00010");

首先,

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中尝试这样的事情。这没有意义。