C6384
警告 C6384: ポインターのサイズを別の値によって除算しています
この警告は、サイズ計算が正しくないことを示します。配列内の要素の数を計算するために、配列のサイズを最初の要素のサイズで除算する方法がありますが、配列が実際にはポインターである場合、意図したとおりの結果が得られません。
ポインターが関数パラメーターであり、バッファーのサイズが渡されなかった場合、使用できるバッファーの最大値は計算できません。ポインターがローカルで割り当てられる場合、その割り当てに使用するサイズを使用します。
使用例
この警告が発生するコード例を次に示します。
#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 などがあります。詳細については、「スマート ポインター (Modern C++)」および「C++ 標準ライブラリ リファレンス」を参照してください。