C6384C6384

предупреждение C6384: деление sizeof указателя на другое значениеwarning C6384: dividing sizeof a pointer by another value

Это предупреждение означает, что вычисление размера может быть неправильным.This warning indicates that a size calculation might be incorrect. Чтобы вычислить количество элементов в массиве, иногда можно разделить размер массива на размер первого элемента; Однако если массив фактически является указателем, результат обычно отличается от предполагаемого.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.

Если указатель является параметром функции и размер буфера не был передан, то невозможно вычислить максимальный доступный буфер.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. Когда указатель выделяется локально, следует использовать размер, используемый в выделении.When the pointer is allocated locally, the size used in the allocation should be used.

ПримерExample

Это предупреждение создается в следующем коде: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]);
  }
}

Чтобы исправить это предупреждение, передайте размер буфера, как показано в следующем коде: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);
  }
}

Чтобы устранить это предупреждение с помощью функции безопасного строкового _tcsncpy_s, используйте следующий код: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);
  }
}

Обратите внимание, что использование новых и удаляемых элементов имеет много ловушек с точки зрения утечек памяти и исключений.Note that the use of new and delete have many pitfalls in terms of memory leaks and exceptions. Чтобы избежать такого рода утечек и проблем с исключениями, используйте механизмы, предоставляемые библиотекой стандартных шаблонов 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). К ним относятся shared_ptr, unique_ptrи vector.These include shared_ptr, unique_ptr, and vector. Дополнительные сведения см. в разделе интеллектуальные указатели и Стандартная библиотека C++.For more information, see Smart Pointers and C++ Standard Library.

См. также разделSee also