在下面的代码中,这一行将移动整个内存并将其分配给pm,还是只移动内存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;
}
发布于 2015-10-17 16:29:21
它将把指针p
pm
**.**复制到指针中
“移动”指针没有任何意义,因为:
您对整个数组将以某种方式“移动”的期望也没有任何意义,因为:
int*
不知道其实例可能指向的数据。记住,这个名字很糟糕的std::move
实际上不会移动任何东西。它只是从名称中给出一个rvalue,否则可能会被视为lvalue。
在这种情况下,这种区别是不相关的,因此就好像根本没有编写move
一样。
移动语义对于间接管理内存的更大、更复杂的对象非常有用,例如使用指针。您会期望这种类型的移动构造函数或移动赋值运算符可以交换指针。这就是抽象的范围;这就是它有用的程度。
试图将相同的逻辑应用于指针本身没有任何意义,除非在unique_ptr
的情况下,这种抽象是以其最纯粹的形式出现的,因为这样的对象是一个裸指针的非常薄的包装器。仍然只有包装才会被移动。
最好的方法是将p
复制到pm
中,然后将p
设置为不可用的值,从而任意地使p
“无效”。再说一次,很没用。
发布于 2015-10-17 16:34:04
有关更多细节,请访问什么是移动语义?。
指针是“类似”整数,它们包含“地址”。以下代码
int* pm{ move(p) };
在语义上等同于
int* pm = p;
其效果就是将p
持有的“地址”复制到pm
(将其视为整数赋值)。
因此,p
指出的内存永远不会“移动”。
关于这个话题,我最喜欢的话题之一是斯科特·迈尔斯的一个有效C++11/14采样器,他在其中解释了"__std::move()
不移动,std::forward()
不前进.它们是类型.“。)
https://stackoverflow.com/questions/33188885
复制相似问题