在下面的代码中,与 pm 对齐,该行是否会 move 整个内存并将其分配给 pm,或者它只会 move p 指向的内存而不是整个数组?
int main()
{
int* p{ new int[10]{0} };
int* pm{ move(p) };//WILL THIS LINE MOVE THE ENTIRE MEMORY ALLOCATED FOR p THAT IS ENTIRE ARRAY or only the memory p is pointing to?
return 0;
}
最佳答案
它将指针 p
复制到指针 pm
中。
“move ”指针没有意义,因为:
- 他们没有 move 构造函数
- 他们没有 move 赋值运算符
- 它们非常简单, move 它们没有任何好处
您对整个数组将以某种方式“move ”的期望也是没有意义的,因为:
- 您已经只获得了相同数据的句柄,因此无处可移
int*
类型不知道其实例可能指向的数据
请记住,名字很糟糕的 std::move
实际上并没有 move 任何东西。它只是为您提供一个名称中的右值,否则该名称可能会被视为左值。
在这种情况下,区别是无关紧要的,所以就好像您根本没有写move
。
move 语义对于间接管理内存的更大、更复杂的对象很有用,例如使用指针。您会期望此类类型的 move 构造函数或 move 赋值运算符交换指针。就抽象而言,这就是;这就是它的用处。
尝试将相同的逻辑应用于指针本身是没有任何意义的,除非是 unique_ptr
的情况,在这种情况下可以找到最纯粹的抽象形式,因为这样的对象是裸指针上的极薄包装。它仍然只是 move 的包装器。
最好的办法是将 p
复制到 pm
中,然后通过将其设置为某些不可用的方式任意使 p
“无效”值(value)。同样,非常无用。
关于c++ - 详细 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188885/