코드베이스에서 다음 코드를 발견했습니다. 제 동료는 괜찮다고 생각하지만 의심스럽게 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]));
}
}
'* (B *) (& a [i])'는'a [i]'의 메모리 이상으로 데이터를 읽습니다. 마지막 요소는 소유 한 메모리 이외의 데이터를 읽습니다. –
'push_back'은'B'의 복사 의미를 사용하여'A'를 복사합니다. (a, b 또는 c를 복사하지 않는 한) 초기화되지 않은 메모리를 확실히 읽습니다. –
@ LuchianGrigore 이미 dereencing이 UB가 아닌가요? – bennofs