C6384C6384

Ostrzeżenie C6384: dzielenie wskaźnika sizeof przez inną wartośćwarning C6384: dividing sizeof a pointer by another value

To ostrzeżenie wskazuje, że Obliczanie rozmiaru może być nieprawidłowe.This warning indicates that a size calculation might be incorrect. Aby obliczyć liczbę elementów w tablicy, jeden czasami dzieli rozmiar tablicy o rozmiar pierwszego elementu; Jeśli jednak tablica jest w rzeczywistości wskaźnikiem, wynik jest zwykle różny od zamierzone.To calculate the number of elements in an array, one sometimes divides the size of the array by the size of the first element; however, when the array is actually a pointer, the result is typically different than intended.

Jeśli wskaźnik jest parametrem funkcji i rozmiar buforu nie został przekazano, nie można obliczyć maksymalnego dostępnego buforu.If the pointer is a function parameter and the size of the buffer was not passed, it is not possible to calculate the maximum buffer available. Po przydzieleniu wskaźnika lokalnie należy użyć rozmiaru używanego w alokacji.When the pointer is allocated locally, the size used in the allocation should be used.

PrzykładExample

Poniższy kod generuje to ostrzeżenie:The following code generates this warning:

#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]);
  }
}

Aby poprawić to ostrzeżenie, Przekaż rozmiar buforu, jak pokazano w poniższym kodzie:To correct this warning, pass the buffer size as shown in the following code:

#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);
  }
}

Aby skorygować to ostrzeżenie przy użyciu funkcji bezpiecznego ciągu _tcsncpy_s, użyj następującego kodu:To correct this warning using the safe string function _tcsncpy_s, use the following code:

void f( )
{
  LPTSTR dest = new TCHAR[SIZE];
  char src [SIZE] = "Hello, World!!";
  if (dest)
  {
    _tcsncpy_s(dest, SIZE, src, SIZE);
  }
}

Należy zauważyć, że użycie nowych i usuniętych elementów ma wiele pułapek w zakresie przecieków pamięci i wyjątków.Note that the use of new and delete have many pitfalls in terms of memory leaks and exceptions. Aby całkowicie uniknąć tego rodzaju przecieków i problemów z wyjątkami, użyj mechanizmów, które są dostarczane przez standardową bibliotekę szablonów języka C++ (STL).To avoid these kinds of leaks and exception problems altogether, use the mechanisms that are provided by the C++ Standard Template Library (STL). Należą do nich shared_ptr, unique_ptri wektor.These include shared_ptr, unique_ptr, and vector. Aby uzyskać więcej informacji, zobacz inteligentne wskaźniki i standardowa biblioteka języka C++.For more information, see Smart Pointers and C++ Standard Library.

Zobacz teżSee also