我知道 memset 不受欢迎class
初始化。例如,如下所示:
class X { public:
X() { memset( this, 0, sizeof(*this) ) ; }
...
} ;
将会破坏vtbl
如果有一个virtual
混合中的功能。
我正在开发一个(巨大的)遗留代码库,它是 C 风格的,但用 C++ 编译,因此所有相关成员通常都是 POD,不需要传统的 C++ 构造函数。 C++ 的使用逐渐普及(如虚拟函数),这让那些没有意识到 memset 具有这些额外的 C++ 牙齿的开发人员感到苦恼。
我想知道是否有一种 C++ 安全方法来执行初始包罗万象的零初始化,然后可以进行特定的成员初始化,其中零初始化不合适?
我发现类似的问题C++ 中的 memset 初始化 https://stackoverflow.com/questions/2481654/memset-for-initialization-in-c, and 使用 memset 将派生结构清零 https://stackoverflow.com/questions/7082691/zeroing-derived-struct-using-memset。这两个都有“不要使用 memset()”答案,但没有好的替代方案(特别是对于可能包含许多成员的大型结构)。
对于您找到的每个班级memset
调用,添加一个memset
成员函数忽略指针和大小参数并对所有数据成员进行赋值。
edit:实际上,它不应该忽略指针,它应该将它与this
。如果匹配,则为对象执行正确的操作;如果不匹配,则重新路由到全局函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)