正如其他人所说,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++ 程序是合法、安全和明智的,但这并不是其中之一。