C6384
警告 C6384:用另一值除指针的 sizeof 值
此警告意味着大小计算可能有误。为了计算数组中元素的数目,用户有时用第一个元素的大小除数组的大小;但是,当数组实际上是指针时,结果通常与所预期的不同。
如果指针是函数参数,而且未传递缓冲区的大小,则不能计算可用的最大缓冲区。当指针在本地分配时,应当使用在分配时所使用的大小。
示例
下面的代码生成此警告:
#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]);
}
}
若要更正此警告,请传递缓冲区大小,如下面的代码所示:
#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 更正此警告,请使用下面的代码:
void f( )
{
LPTSTR dest = new TCHAR[SIZE];
char src [SIZE] = "Hello, World!!";
if (dest)
{
_tcsncpy_s(dest, SIZE, src, SIZE);
}
}
就内存泄露以及内存异常而言,请注意使用new 与 delete 方法存在许多陷阱.若要完全避免这些泄漏和异常问题,请使用 C++ 标准模板库 (STL) 提供的结构。这些包括shared_ptr, unique_ptr, 和 vector有关更多信息,请参见智能指针(现代 C++)和C++ 标准库参考。