他の人が言ってmemset()
いるように、これを行う正しい方法ではありません。ただし、そうでない理由については、いくつかの微妙な点があります。
まず、使用しようとしているのはバイトmemset()
をクリアすることだけです。sizeof(void *)
あなたのサンプルケースでは、それは偶然にもx
メンバーが占有するバイトです。
簡単な修正はmemset(this, 0, sizeof(*this))
、この場合は と の両方x
を設定する を書き込むことy
です。
ただし、vector2
クラスに仮想メソッドがあり、通常のメカニズムを使用してコンパイラがそれらを表す場合、ポインターを NULLに設定することで、インスタンスmemset
が破棄され、中断されます。これは悪いことです。vtable
vtable
もう 1 つの問題はT
、ビットを 0 に設定するよりも複雑なコンストラクター アクションが型に必要な場合、メンバーのコンストラクターは呼び出されませんmemset()
が、メンバーの内容を.
唯一の正しいアクションは、デフォルト コンストラクターを次のように記述することです。
vector2(): x(0), y(0), {}
そして、これを使用しようとすることをまったく忘れてくださいmemset()
。
編集:x
D.Shawley はコメントで、デフォルトのコンストラクターがとy
の前に実際に呼び出され たことを指摘しましたmemset()
。技術的には正しいのですが、呼び出しmemset()
はメンバーを上書きします。これはせいぜい非常に悪い形式であり、最悪の場合、未定義の動作の悪魔を呼び出します。
書かれているように、クラスはvector2
PODT
です。T
int
float
ただし、T
何らかのbignum
値クラスであることが原因で、診断が非常に困難な問題が発生する可能性があります。運が良ければ、 によって作成された NULL ポインターの逆参照によるアクセス違反によって、早期に発生する可能性がありますmemset()
。しかし、Lady Luck は気まぐれな愛人であり、より可能性の高い結果は、一部のメモリがリークされ、アプリケーションが "不安定" になることです。または、「揺れる」可能性が高いです。
OPは、別の回答に対するコメントで「...memsetを機能させる方法はありませんか?」と尋ねました。
答えは単純に「いいえ」です。
C++ 言語を選択し、テンプレートを最大限に活用することを選択した場合、言語を正しく使用することによって、それらの利点を支払う必要があります。コンストラクターをバイパスするのは正しくありません (一般的な場合)。memset()
C++ プログラムで呼び出すことが合法で、安全で、賢明な状況もありますが、これはその 1 つではありません。