C6384
upozornění C6384: vydělení sizeof ukazatele jinou hodnotou
Toto upozornění naznačuje, že výpočet velikosti může být nesprávný.Při výpočtu počtu prvků v poli je někdy velikost pole vydělena velikostí prvního prvku. Avšak, pokud je pole ukazatelem, výsledek se bude lišit od původního očekávání.
Pokud je ukazatel parametrem funkce a nebyla předána velikost vyrovnávací paměti, není možné vypočítat maximální dostupnou vyrovnávací paměť.Pokud je ukazatel přidělen lokálně, měla by být použita velikost, která byla použita při přidělování.
Příklad
Následující kód generuje toto upozornění:
#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]);
}
}
Chcete-li opravit toto upozornění, předejte velikost vyrovnávací paměti, jak je znázorněno v následujícím kódu:
#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);
}
}
Pro nápravu tohoto upozornění použitím bezpečné funkce _tcsncpy_s pro práci s řetězci použijte následující kód:
void f( )
{
LPTSTR dest = new TCHAR[SIZE];
char src [SIZE] = "Hello, World!!";
if (dest)
{
_tcsncpy_s(dest, SIZE, src, SIZE);
}
}
Všimněte si, že použití new a delete mnoho nástrah v podobě nevracení paměti a výjimek.Chcete-li zabránit těmto druhům problémů úniky a výjimkami zcela, použijte mechanismy, které jsou k dispozici v knihovně C++ STL.Patří mezi ně shared_ptr, unique_ptr a vector.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.