6

オブジェクトを NULL に設定することと、ZeroMemory を使用することの正確な違いは何ですか?

WinAPI (ほとんどが C) では、C オブジェクトで ZeroMemory を使用することをお勧めします。私は C# のバックグラウンドを持っていますが、これは C++ の人が本当に知っておくべきことのようです。

DirectX API を使用すると、オブジェクトを ZeroMemory するかどうかに関係なく、アプリケーションは引き続き動作しますが、ZeroMemory を使用するサンプルと使用しないサンプルがあります。

誰でもこれらのことを明確にすることができますか?

4

8 に答える 8

5

ZeroMemoryメモリのブロックをゼロで埋めます。

ポインターを NULL に設定すると、ポインターが何も指すようになるだけであり、ポインターが指しているメモリをゼロで埋めることとは異なります (たとえば、そのポインターを介してそのメモリにアクセスすることはできます)。

そのオブジェクトで何か有用なことを行う前に、これらのゼロをより意味のあるものに置き換える必要がある可能性があります。これが、使用するプログラムと使用しZeroMemoryないプログラムの両方が機能する理由です。

このコンテキストでの理由はZeroMemory、アクセス ポイントで初期化されていないオブジェクトに対する操作を簡単に見つけることができるためです (たとえば、Visual Studio は初期化されていないメモリに0x0c0c0c0c/* または類似の */ を使用しているため、デバッグ中にこのパターンに遭遇すると、オブジェクトがまだ初期化されていないことがわかっています)。

于 2013-04-25T09:11:39.997 に答える
3

C および C++ では、「オブジェクト」を に設定することはできませんNULLオブジェクトへのポインターは に設定できますNULL。これは、ポインター自体が何も指していない (「ヌル オブジェクト」) ことを意味します。

これは、オブジェクトの内容を「すべてのビットをゼロ」に設定することとは異なりますZeroMemory()structs通常、これは、反応が非常に悪い可能性のある本格的な C++ オブジェクトではなく、に対してのみ行うことができます。

于 2013-04-25T09:06:28.720 に答える
2

ZeroMemory() はメモリに値 0 を設定します。つまり、メモリをクリアします。また、オブジェクト (オブジェクトへのポインタ) を NULL に設定すると、そのオブジェクトのベース アドレスが 0 に初期化されます。

于 2013-04-25T09:05:05.790 に答える
0

ZeroMemoryメモリのより大きなチャンクをゼロに設定するためのものです。オブジェクトにコンストラクターまたは仮想メソッドがある場合、「POD」(プレーンな古いデータ) ではないオブジェクトでは使用しないでください。

NULLポインターが「何もない」を指していることを示すために使用されます。

ZeroMemory(pointer, sizeof(pointer));技術的には、 asから同じ結果が得られますがpointer = NULL;、a) 2 番目の方が明確であり、b) 後者を実行する方が同じか速い可能性が高いです。

于 2013-04-25T09:06:45.900 に答える
0

Zero memoryメモリの一部をゼロに設定し、大きなベクトルをゼロに設定するためのより一般的なオブジェクトに使用するのは有害であり、高速に動作しNull、ポインターが何も指さないようにしたい場合に一般的であり、その使用法はプログラムのポインターまたは設定に依存します記憶値

于 2013-04-25T09:18:11.183 に答える