警告 C6384
ポインターのサイズを別の値で除算する
この警告は、サイズ計算が正しくないことを示します。 配列内の要素の数を計算するために、配列のサイズを最初の要素のサイズで除算することがあります。 ただし、配列が実際にポインターである場合、結果は通常、意図した結果とは異なります。
解説
ポインターが関数パラメーターであり、バッファーのサイズが渡されなかった場合、使用可能な最大バッファーを計算することはできません。 ポインターがローカルで割り当てられる場合、その割り当てに使用するサイズを使用します。
コード分析名: DIVIDING_SIZEOF_POINTER
例
次のコードでは、警告 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);
}
}
メモリ リークとdelete
例外のnew
観点から、多くの落とし穴があり、使用されます。 このような潜在的なリークを完全に回避するには、C++ 標準ライブラリ (STL) によって提供されるメカニズムを使用します。 これらには、次unique_ptr
のようなvector
コンテナーが含まれますshared_ptr
。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示