问题描述
我有一个代码示例,我想请您检查一下并告诉我我的理解是否正确。我正在学习 C++,所以如果这些问题很初级,我深表歉意。我已经阅读了 C++ 如何处理内存管理,但我还没有找到实际的例子。我正在尝试自己写一些。
代码示例:
std::vector<std::vector<int32_t>> containerOfVectors;
for (int i = 0; i < 2; i++) {
std::vector<int32_t> innerVector;
innerVector.push_back(1);
containerOfVectors.push_back(move(innerVector));
innerVector.push_back(2);
innerVector.push_back(3);
innerVector.push_back(4);
std::cout << "innerVector " << std::to_string(i) << " contains: " << std::endl;
for (int k = 0; k < innerVector.size(); k++) {
std::cout << "\t" << std::to_string(innerVector[k]) << std::endl;
}
}
for (int i = 0; i < 2; i++) {
std::vector<int32_t> vector = containerOfVectors[i];
std::cout << "Vector " << std::to_string(i) << " contains " << std::to_string(vector.size()) << " element(s)" << std::endl;
}
----------
Output:
----------
innerVector 0 contains:
2
3
4
innerVector 1 contains:
2
3
4
Vector 0 contains 1 element(s)
Vector 1 contains 1 element(s)
我有一个(容器)向量向量,我正在循环并在循环内创建两个向量,它们被添加到 containerOfVectors
中。我向循环内的向量添加一个元素,将其移动到 containerOfVectors
,然后再添加三个元素。
在第二个循环中,当我迭代 containerOfVectors
并打印出值时,我只看到 1
。值 2
、3
和 4
不存在。
我对此的理解是 move
调用将 innerVector
的元素复制到一个新向量中,此时 innerVector
变为空。因此,在循环迭代结束时,innerVector
将只包含 2、3 和 4,因为只移动了 1。然后 innerVector
被销毁。
那个移动实际上是“复制”,还是“移动”同一个“2”?如果值是结构而不是整数,它会(或如何)不同吗?我如何自己测试?通过打印内存地址,或者同一个底层实例的内存地址可以不同吗?
我很抱歉这里有很多东西需要解压。非常感谢任何指导。
解决方法
移动语义创建新对象。它不是复制或赋值,而是被调用的移动构造函数。因此,如果您调用 move(innerVector)
,您实际上创建了一个新的向量对象作为 containerOfVectors 中的条目。这会在您拨打电话时自动包含原始 innerVector
的内容/数据。之后,innerVector 为空,无论你用它做什么都不会影响containerOfVectors 中的新对象。这两个不同的对象之间没有联系。使用移动构造创建的对象的内存地址肯定与其原始对象不同。
这充分解释了您示例的输出。对于向量中的任何其他数据类型,还有结构,这将是一样的。