【发布时间】:2016-08-28 14:59:41
【问题描述】:
我发现了意想不到的(至少对我而言)行为。
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和@ 987654327@ 指向无处。
std::move 之后变量的地址真的可以改变吗(我以为move 并没有真正移动对象,它就是为此而发明的)?
如果可以更改,处理它的通常模式是什么(相应地更改指针)?
如果无法更改,是否会发生这种行为,因为我尝试将此类对象移动到 std::list(因此以某种方式发生了复制,它会更改变量的地址并使指针指向错误的位置)?
【问题讨论】:
-
您的代码与
std::move无关。即使你不使用它也会有同样的问题。 -
_end = '\0';你的意思是*_end? -
@Michael,是的,你是对的,我在这里复制代码时出错
-
@Rakete1111:问题在代码中很明显。
-
@Arkady:不要重新输入代码。使用复制粘贴粘贴您在家中使用的文字、实际代码作为最小示例。如果代码太多,请重新编写最小示例以使其更小。