【问题标题】:Using memset to clear base class members使用 memset 清除基类成员
【发布时间】: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));
    }
};

【问题讨论】:

  • 这是未定义的行为。无需再多说什么来证明对整个事情进行分类是合理的。
  • memset 替换为*this = BaseStruct();,或者在C++11 中,替换为static_cast&lt;BaseStruct&gt;(*this) = {};。归零没有令人讨厌的未定义行为。
  • 这里有一些解决方案:stackoverflow.com/a/38103250/3223828

标签: c++


【解决方案1】:

BaseStruct 没有虚拟成员,所以你应该很好。 vtbl 应该用于 BaseA。但是,如果可以明确地重置每个单独的成员,那就更好了。这是推荐的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2015-08-04
    • 2012-10-18
    相关资源
    最近更新 更多