【发布时间】:2012-10-15 19:28:15
【问题描述】:
我知道 memset 在 class 初始化时不受欢迎。例如,如下所示:
class X { public:
X() { memset( this, 0, sizeof(*this) ) ; }
...
} ;
如果组合中有 virtual 函数,将破坏 vtbl。
我正在开发一个(庞大的)遗留代码库,它是 C-ish 但用 C++ 编译的,所以所有有问题的成员通常都是 POD,不需要传统的 C++ 构造函数。 C++ 的使用逐渐普及(就像虚函数一样),这让那些没有意识到 memset 具有这些额外的 C++ 优势的开发人员陷入了困境。
我想知道是否有一种 C++ 安全的方法来进行初始的全覆盖零初始化,然后可以在不适合零初始化的情况下进行特定的成员初始化?
我发现了类似的问题memset for initialization in C++ 和zeroing derived struct using memset。这两个都有“不要使用 memset()”的答案,但没有好的选择(尤其是对于可能包含许多成员的大型结构)。
【问题讨论】:
-
一般你取第一个字段的地址,然后从那里清除。毫无疑问,这违反了一些规则,但它总是对我有用。
-
另一种选择是为类编写自己的分配例程,这样您就可以确保空间被清除,但 IIRC 对此有限制。
-
你不是说
memset(this, 0, sizeof *this)吗? (是的,这也会破坏 vtbl。) -
@HotLicks,似乎这种方法的问题在于知道正确的大小。 sizeof(this) 不可能与 sizeof() 相同。
-
这不仅仅是关于 vtable,你还可以有非标准的布局成员,
memset也会搞砸。做出选择:用 C 编写(并删除 C++ 部分)或用 C++ 编写(并使用 C++ 习语)。将这两种东西混合起来很危险,而且可能更容易(也更优越)开始花时间一次修复这些类,以便为它们提供适当的构造函数,而无需花言巧语。
标签: c++ initialization