Compartir a través de


Advertencia C26407

Preferir objetos con ámbito, no asigne el montón innecesariamente (r.5)

Para evitar el uso innecesario de punteros, intentamos detectar patrones comunes de asignaciones locales. Por ejemplo, detectamos el momento en que el resultado de una llamada al operador new se almacena en una variable local y, posteriormente, se elimina explícitamente. Esta comprobación admite la regla de directrices básicas de C++ R.5: Preferir objetos con ámbito, no asigne el montón innecesariamente. Para corregir el problema, use un tipo RAII, en lugar de un puntero sin procesar, y déjelo que se ocupe de los recursos. Obviamente, no es necesario crear un tipo contenedor para asignar un solo objeto. En su lugar, funcionaría mejor una variable local del tipo del objeto.

Comentarios

  • Para reducir el número de advertencias, el análisis de código solo detecta este patrón para punteros de propietario. Por consiguiente, es necesario marcar primero correctamente a los propietarios. Podemos ampliar fácilmente este análisis para cubrir punteros sin procesar si recibimos comentarios sobre la Comunidad de desarrolladores de Visual Studio C++ de clientes que admiten estos escenarios.

  • El término objeto con ámbito inducir a error. En general, se recomienda usar una variable local cuya duración se administre automáticamente, o bien un objeto inteligente que administre eficazmente los recursos dinámicos. Los objetos inteligentes pueden realizar asignaciones de montón, pero no es explícita en el código.

  • Si la advertencia se desencadena en la asignación de matrices, que a menudo es necesaria para los búferes dinámicos, puede corregirla mediante contenedores estándar o std::unique_pointer<T[]>.

  • El patrón solo se detecta para variables locales. No se advierte en los casos en los que se asigna una asignación, por ejemplo, una variable global y, a continuación, se elimina en la misma función.

Nombre del análisis de código: DONT_HEAP_ALLOCATE_UNNECESSARILY

Ejemplo 1: Asignación de objetos innecesaria en el montón

auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer;  // C26407

Ejemplo 2: Asignación de objetos innecesaria en el montón (fijo con objeto local)

Tracer tracer;  // OK
ScanObjects(&tracer);

Ejemplo 3: Asignación de búfer innecesaria en el montón

auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
    CheckValue(value);
delete[] value; // C26407

Ejemplo 4: Asignación de buffer innecesaria en el montón (fijo con contenedor)

auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
    CheckValue(value.data());