使用 memset 清除基类成员
Posted
技术标签:
【中文标题】使用 memset 清除基类成员【英文标题】:Using memset to clear base class members 【发布时间】:2014-04-09 12:01:27 【问题描述】:我看到如下代码但不喜欢它。特别是 memset(static_cast(this), 0, sizeof(BaseStruct)); 我需要重构的参数,在这里找到了一个:Why can it be dangerous to use this POD struct as a base class?
您是否发现更多问题? vtable有危险吗?
// abstract class
class BaseA
public:
virtual void doSomethingA() = 0;
;
// no method, no virtual method, only simple data
typedef struct BaseStruct
int x;
float y;
long z[10];
BaseStruct;
class Subclass : public BaseA, public BaseStruct
public:
virtual void doSomethingA()
virtual void doSomethingElse()
void resetBaseA()
memset(static_cast<BaseStruct*>(this), 0, sizeof(BaseStruct));
;
【问题讨论】:
这是未定义的行为。无需再多说什么来证明对整个事情进行分类是合理的。 Empty derived optimization的可能重复 将memset
替换为*this = BaseStruct();
,或者在C++11 中,替换为static_cast<BaseStruct>(*this) = ;
。归零没有令人讨厌的未定义行为。
这里有一些解决方案:***.com/a/38103250/3223828
【参考方案1】:
BaseStruct 没有虚拟成员,所以你应该很好。 vtbl 应该用于 BaseA。但是,如果可以明确地重置每个单独的成员,那就更好了。这是推荐的。
【讨论】:
以上是关于使用 memset 清除基类成员的主要内容,如果未能解决你的问题,请参考以下文章