V811. Decreased performance. Excessive type casting: string -> char * -> string.


Анализатор обнаружил код, который потенциально можно оптимизировать. В коде присутствует избыточное создание объекта типа 'std::string', от которого можно избавиться.

У объекта класса 'std::string' с помощью функции 'c_str()' берется указатель на массив символов. Затем из этих символов конструируется новый объект типа 'std::string'. Например, это возможно, если неоптимальное выражение является:

  • аргументом вызова функции;
  • операндом оператора присваивания;
  • операндом оператора 'return'.

Рассмотрим пример для случая с вызовом функции:

void foo(const std::string &s)
{
  ....
}
....
void bar()
{
  std::string str;
  .... 
  foo(str.c_str());
}

Улучшить код очень просто - достаточно убрать вызов метода 'c_str()'. Рассмотрим пример упрощенного кода:

....
void bar()
{
  std::string str;
  .... 
  foo(str);
}

Пример некорректного кода для оператора присваивания будет иметь вид:

std::string str;
.... 
std::string s = str.c_str();

Пример некорректного кода для оператора 'return' будет иметь вид:

std::string foo(const std::string &str)
{
  .... 
  return str.c_str();
}

Исправить ошибку в этих случаях следует аналогично случаю для вызова функции.


Найденные ошибки

Проверено проектов
364
Собрано ошибок
13 504

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;