使用
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
这是定义的行为吗?如果是,哪个编译器在这里是正确的?
其实不然。特别是如果我们谈论多态类,
memset()
将覆盖vtable
。