2013年3月11日月曜日

std::move ではまった事

 いまの所、std::move ではまった事なぞを、思い出せる範囲で書いてみようと思います。

 直近では、ndk での話ですが、std::unique に move constructor と move operator しか持たないクラスの deque をかけると、見事にデータが壊れました。move に一部対応している状況なので、文句は言えません。自前で move 用の unique をこさえました。特に、このバグは場所を特定できるまでに凄い時間がかかりました。どこで壊れているのか探すのも大変でした。

 vector を std::move にかけて移動させると、要素が倍で増えました。これは、move 後の変数の状態は不定なので、move した後にも残骸が残っており、残骸要素が加算されていくというバグでした。move した後に clear() をコールする事で回避しました。

move constructor だけでなく、copy constructor も追加したら、copy が優先されて、予期せぬ挙動を引き起こしました。copy constructor は封印して、copy ファンクタを利用するようなアルゴリズムをこさえる事で回避しました。

一応、こんなところでしょうか?

0 件のコメント: