予期せぬ(少なくとも私にとっては)動作が見つかりました。私はコード内のどこか後std :: moveは変数のアドレスを変更しますか?
class A
{
char _text[100];
char* _beg;
char* _end;
public:
explicit A(char* text, size_t tsize) : _beg(&text[0]), _end(&text[std::min(tsize, 99)])
{
memcpy(_text, text, std::min(tsize, 99));
*_end = '\0';
}
inline std::string get_text()
{
return std::move(std::string(_beg, _end));
}
};
こと:
A* add_A(A&& a)
{
list_a.push_back(std::move(a));
return &(list_a.back());
}
std::list<A> list_a;
{
add_A(A("my_text", 7));
list_a.back().get_text(); //returns "my_text"
}
list_a.back().get_text(); //returns trash
として唯一私が後にいるかのように、ゴミを取得し、(std::move
を使用して)このクラスを移動し、移動されたオブジェクトのget_text()
を呼び出します変数_text
の移動アドレスが変更されたため、_beg
と_end
はどこにもありません。
std::move
の後に変数のアドレスが実際に変更されることがありますか(私はmove
が実際にオブジェクトを移動しないと思っていましたが、そのために発明されました)?
変更可能な場合は、それを処理する通常のパターンは何ですか(それに応じてポインタを変更する)?
変更できない場合は、そのオブジェクトをstd::list
に移動しようとするとその動作が発生する可能性があります(何らかの理由でコピーが発生すると、変数のアドレスが変更され、ポインタが間違った位置を指してしまいます)。
あなたのコードは 'std :: move'とは関係ありません。それはあなたがそれを使用しない場合でも同じ問題を抱えます。 – milleniumbug
'_end = '\ 0';' '* _end'を意味しましたか? – Michael
@Michael、はい、そうです、ここでコードをコピーすると間違いが起こります – Arkady