首页 > 解决方案 > 在循环内构造向量并将其返回到该范围之外的安全方法?

问题描述

我有一个代码示例,我想请您检查一下并告诉我我的理解是否正确。我正在学习 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. 值234不存在。

我对此的理解是move调用正在将元素复制innerVector到一个新的向量中,并且此时innerVector变为空。因此,在循环迭代结束时,innerVector将仅包含 2、3 和 4,因为仅移动了 1。然后innerVector被摧毁。

该移动实际上是“复制”,还是“移动”相同的“2”?如果值是结构而不是整数,它(或如何)会有所不同吗?我怎样才能自己测试呢?通过打印内存地址,还是同一底层实例的内存地址可以不同?

我很抱歉这里有很多东西要解压。非常感谢任何指导。

标签: c++vectormemory-management

解决方案


移动语义创建新对象。它不是副本或赋值,而是调用的移动构造函数。因此,如果您调用move(innerVector)您实际上是在 containerOfVectors 中创建一个新的矢量对象作为条目。innerVector这会在您拨打电话时自动包含原始内容/数据。之后,innerVector 是空的,无论你用它做什么都不会影响 containerOfVectors 中的新对象。这两个不同的对象之间没有联系。使用移动构造创建的对象的内存地址肯定总是与其原始对象不同。

这完全解释了您的示例的输出。对于向量中的任何其他数据类型,也包括结构,这将是相同的。


推荐阅读