Advertencia C6384
Dividir el tamaño de un puntero por otro valor
Esta advertencia indica que un cálculo de tamaño podría ser incorrecto. Para calcular el número de elementos de una matriz, a veces se divide el tamaño de la matriz por el tamaño del primer elemento. Sin embargo, cuando la matriz es realmente un puntero, el resultado suele ser diferente del previsto.
Comentarios
Si el puntero es un parámetro de función y no se pasó el tamaño del búfer, no es posible calcular el búfer máximo disponible. Cuando el puntero se asigna localmente, se debe utilizar el tamaño usado en la asignación.
Nombre del análisis de código: DIVIDING_SIZEOF_POINTER
Ejemplo
El código siguiente genera la advertencia C6384:
#include <windows.h>
#include <TCHAR.h>
#define SIZE 15
void f( )
{
LPTSTR dest = new TCHAR[SIZE];
char src [SIZE] = "Hello, World!!";
if (dest)
{
_tcsncpy(dest, src, sizeof dest / sizeof dest[0]);
}
}
Para corregir esta advertencia, pase el tamaño de búfer como se muestra en el siguiente código:
#include <windows.h>
#include <TCHAR.h>
#define SIZE 15
void f( )
{
LPTSTR dest = new TCHAR[SIZE];
char src [SIZE] = "Hello, World!!";
if (dest)
{
_tcsncpy(dest, src, SIZE);
}
}
Para corregir esta advertencia mediante la función _tcsncpy_s
de cadena segura , use el código siguiente:
void f( )
{
LPTSTR dest = new TCHAR[SIZE];
char src [SIZE] = "Hello, World!!";
if (dest)
{
_tcsncpy_s(dest, SIZE, src, SIZE);
}
}
El uso de new
y delete
tiene muchos problemas en términos de fugas de memoria y excepciones. Para evitar estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptr
los contenedores , unique_ptr
y , como vector
. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.