lez*_*lon 1 c++ undefined-behavior
我在代码库中找到了以下代码.我的同事认为这没关系,但看起来像UB一样可疑.是不是UB?
class A {
//some stuff
};
class B : public A {
int a;
int b;
int c;
}
void foo( std::vector<A>& a ) {
std::vector<B> b;
for(size_t i = 0 ; i < a.size(); ++i ){
b.push_back( *(B*)(&a[i]) );
}
//remove some elements from b
for(size_t i = 0 ; i < b.size(); ++i ){
a.push_back( *(A*)(&b[i]) );
}
}
Run Code Online (Sandbox Code Playgroud)
这是未定义的行为.原始向量中的真实对象是a A,而不是a B,因此强制转换是不正确的,您将获得未定义的行为.
该代码最常见的结果是不正确的数据(B不存在的成员A从向量中的下一个对象(如果存在)或从以下内存位置读取)或崩溃(如果它恰好是最后一个元素) ,原始向量中没有保留额外空间,并且读取恰好扩展到受保护的内存页面.