C6384
aviso C6384: Dividindo o sizeof de um ponteiro por outro valor
Este aviso indica que um cálculo de tamanho pode estar incorreto.Para calcular o número de elementos em uma matriz, às vezes, alguém divide o tamanho da matriz pelo tamanho do primeiro elemento. No entanto, quando a matriz é realmente um ponteiro, o resultado geralmente é diferente do pretendido.
Se o ponteiro for um parâmetro de função e o tamanho do buffer não tiver sido passado, não é possível calcular o buffer máximo disponível.Quando o ponteiro é alocado localmente, o tamanho usado na alocação deve ser usado.
Exemplo
O código a seguir gera este aviso:
#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 corrigir este aviso, informe o tamanho do buffer, como mostrado no código o seguir:
#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 corrigir este aviso usando a função _tcsncpy_s de cadeia de caracteres segura, use o código a seguir:
void f( )
{
LPTSTR dest = new TCHAR[SIZE];
char src [SIZE] = "Hello, World!!";
if (dest)
{
_tcsncpy_s(dest, SIZE, src, SIZE);
}
}
Observe que o uso de new e delete tem muitas armadilhas em termos de vazamentos de memória e exceções.Para evitar esses tipos de vazamentos e problemas de exceção no geral, use os mecanismos que são fornecidos pela STL (Biblioteca de Modelos Padrão) do C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão C++.