Необходимо ли присваивать значение null временному строковому значению после его использования?

#c #string

#c #строка

Вопрос:

Допустим, у меня есть фрагмент кода, подобный этому:

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

            }
  

Излишне ли присваивать NULL buf, поскольку я собираюсь повторно использовать строковую переменную в следующем else if операторе? Спасибо!

Комментарии:

1. Это не только избыточно, но и запрещено по std::string контракту, не говоря уже о том, что незаконно, поскольку buf уже было объявлено. NULL (или лучше, nullptr ) предназначено для указателей.

2. @chris Это то, что я предположил, но просто хотел убедиться. Спасибо

3. string(NULL) на самом деле вызывает неопределенное поведение. Пустой строкой является string() или string("") . И самый простой способ очистить строку — это buf.clear();

Ответ №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. еще лучше, barzip = string("00010");

Ответ №2:

Вам не нужно этого делать. Область действия переменной buf находится только в этой ветви else инструкции if. Если этот код не выполняется, то buf никогда не создается. Кроме того, если этот же код выполняется в цикле, это каждый раз новый buf, поскольку, как только вы покидаете ветку else if там, buf забывается.

обратите также внимание, что вы можете сделать это:

 string buf("00010");
  

Вместо:

 string buf = string("00010");
  

Ответ №3:

Прежде всего,

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

не будет компилироваться, потому что вы пытаетесь объявить две переменные с одинаковым именем ( buf ) в одном блоке.

Во-вторых, вы нигде не присваиваете NULL значение. Вы инициализируете неназванную временную строку с помощью NULL . Это неопределенное поведение, которое означает, что при запуске программы может произойти что угодно.

Если вам повезет, он немедленно завершит работу и покажет вам, что в вашем коде есть ошибка. Если вам не повезет, это не приведет к сбою и не причинит ничего вредного в течение первых 20 раз, когда вы выполняете программу, и завершится сбоем с 21-й попытки, что приведет к бесконечному поиску ошибок.

После незаконной инициализации вы технически присваиваете buf эту неназванную временную строку, но поскольку поведение на тот момент уже не определено, бессмысленно рассуждать об этом дальше.

Похоже, у вас есть опыт работы с C и вы привыкли к ручной обработке char указателей. В C лучше концептуально обрабатывать std::string объекты точно так же, как встроенные типы без указателей. Вы «очищаете» int , когда оно больше не используется? Вы, конечно, этого не делаете. Вы «очищаете» a double перед присвоением ему нового значения? Опять же, вы этого не делаете. Так что не пытайтесь делать такие вещи с std::string , либо. Это просто не имеет смысла.