与在C 中返回向量的行为不一致

Inconsistent behavior with returning a vector in c++

本文关键字:不一致 向量 返回 与在      更新时间:2023-10-16

我正在从事C (11)中的一个项目,并且在从函数中返回向量方面存在一些问题。我问题的最小工作示例如下:

#include <iostream>
#include <vector>
using namespace std;
vector<int*> find_items()
{
    vector<int*> items;
    int a[2] = {1,2};
    items.push_back(a);
    cout << items.at(0)[0] << endl;
    return items;
}
int main()
{
    vector<int*> items = find_items();
    cout << items.at(0)[0] << endl;
    return 0;
}

我希望能够与项目尺寸2的阵列一起工作,因此我正在使用这些阵列的第一个元素的指针向量。这似乎可以正常工作,除非我需要从函数返回这样的向量。

在此代码中,从我的天真的角度来看,我应该在两个Cout上获得相同的输出,而是第二个打印似乎是垃圾号码。

我读到,当函数返回一个函数时,C 返回向量的副本。但是在这种情况下,在向量的副本中会创建新的指针吗?我的猜测是,这些新指针实际上指出了错误的位置。此副本不够深,还是这些副本?在这种情况下,返回向量的正确方法是什么?

非常感谢您的任何帮助!

您正在创建find_items内部的数组。在此功能的末尾,阵列被破坏了。指针无效。行为不确定。使用vector<vector<int>>vector<array<int>>代替vector<int*>

#include <iostream>
#include <vector>
#include <array>
using namespace std;
vector<array<int, 2>> find_items()
{
    vector<array<int, 2>> items;
    array<int, 2> a = {1,2};
    items.push_back(a);
    cout << items.at(0)[0] << endl;
    return items;
}
int main()
{
    vector<array<int, 2>> items = find_items();
    cout << items.at(0)[0] << endl;
    return 0;
}