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

Posted

技术标签:

【中文标题】在 C++ 中返回向量的行为不一致【英文标题】:Inconsistent behavior with returning a vector in c++ 【发布时间】:2019-03-09 20:57:42 【问题描述】:

我正在使用 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() 函数返回,这些将不再有效。 优秀延伸阅读:Can a local variable's memory be accessed outside its scope? 【参考方案1】:

您正在find_items 内创建一个数组。在此函数结束时,数组被销毁。指针无效。行为未定义。使用vector&lt;vector&lt;int&gt;&gt;vector&lt;array&lt;int&gt;&gt; 而不是vector&lt;int*&gt;

#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;

【讨论】:

以上是关于在 C++ 中返回向量的行为不一致的主要内容,如果未能解决你的问题,请参考以下文章

stringstream >> 不一致的 '\n' 分隔符行为

我有记忆不一致吗?苹果系统

openMP C++ 简单并行区域 - 输出不一致

从 C++ 函数与 Python 函数返回的值不一致,用于偏斜正态分布

在 R 中格式化具有不一致日期格式的向量

从我的向量打印的项目数与向量中的假定项目数不一致[关闭]