1

コードベースで次のコードを見つけました。私の同僚は大丈夫だと思っていますが、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]) );
   }

}
4

2 に答える 2

6

それは未定義の動作です。元のベクトル内の実際のオブジェクトはAではなく であるBため、キャストが正しくなく、未定義の動作が発生します。

そのコードからの最も一般的な結果は、不正なデータ (B存在しないのメンバーは、存在Aする場合はベクター内の次のオブジェクトから、または次のメモリ位置から読み取られます) またはクラッシュ (最後の要素である場合) のいずれかです。 、元のベクトルに予約された余分なスペースがなく、読み取りがたまたま保護されているメモリページに拡張されました。

于 2013-07-09T17:56:15.827 に答える