在构造函数中将空的 C++ 类清零并从它们继承是否合法?

问题描述 投票:0回答:1

使用

memset
在构造函数中将其对象归零的库并不罕见。有时空班级也会发生这种情况。安全吗,尤其是当继承这样的类时。

考虑以下示例:

#include <iostream>
#include <cstring>

struct A { char a; };

struct B {
  B() { std::memset( this, 0, sizeof(B) ); } 
};

struct C : A, B {};

static_assert( sizeof(C) == 1 );

int main() {
    std::cout << (int)C{ {1},  {} }.a
              << (int)C{ {1}, B{} }.a;
}

GCC 在此打印

00
,Clang 打印
01
,MSVC 在发射时打印
11

warning C4789: buffer '' of size 1 bytes will be overrun; 1 bytes will be written starting at offset 1

在线演示:https://gcc.godbolt.org/z/jW1edecrd

这是定义的行为吗?如果是,哪个编译器在这里是正确的?

c++ constructor language-lawyer multiple-inheritance memset
1个回答
0
投票

其实不然。特别是如果我们谈论多态类,

memset()
将覆盖
vtable

© www.soinside.com 2019 - 2024. All rights reserved.