正如其他人所说,memset()这不是正确的方法。然而,关于为什么不这样做有一些微妙之处。
首先,您尝试使用memset()的只是清除sizeof(void *)字节。对于您的示例情况,这显然是成员占用的字节数x。
简单的解决方法是编写memset(this, 0, sizeof(*this)),在这种情况下会同时设置x和y。
但是,如果您的vector2类有任何虚方法,并且编译器使用通常的机制来表示它们,那么这将通过将指针设置为 NULLmemset来破坏vtable并破坏实例。vtable哪个不好。
另一个问题是,如果该类型T需要一些比将其位设置为 0 更复杂的构造函数操作,则不会调用成员的构造函数,但它们的效果会因用 覆盖成员的内容而被破坏memset()。
唯一正确的操作是将默认构造函数编写为
vector2(): x(0), y(0), {}
并且完全忘记尝试使用memset()它。
编辑: D.Shawley 在评论中指出,在提供的原始代码中,默认构造函数实际上是在x和y之前调用的。memset()虽然在技术上是正确memset()的,但调用会覆盖成员,这充其量是非常非常糟糕的形式,最坏的情况是调用未定义行为的恶魔。
正如所写,vector2该类是 POD,只要类型T也是普通的旧数据,如果T是int或float.
然而,所需要的只是T成为某种bignum价值类别来导致可能很难诊断的问题。如果幸运的话,它们会通过取消引用由memset(). 但幸运女神是一个善变的情妇,更有可能的结果是一些内存泄漏,应用程序变得“不稳定”。或者更有可能,“摇摇欲坠”。
OP 在对另一个答案的评论中问道“......难道没有办法让 memset 工作吗?”
答案很简单,“不”。
选择了 C++ 语言并选择充分利用模板后,您必须通过正确使用该语言来为这些优势付出代价。绕过构造函数(在一般情况下)根本不正确。虽然在某些情况下调用memset()C++ 程序是合法、安全和明智的,但这并不是其中之一。