1

我想从 C++ 中的函数返回一个数组。我做了这个简单的代码来尝试实现它。

#include <iostream>
#include <vector>

std::vector<int> *getx()
{
   std::vector<int> a[2];
   a[0].push_back(0);
   a[1].push_back(1);
   return a;
}

int main()
{
   std::vector<int>* b = getx();
   return 0;
}

它有效,但我收到此警告:

warning C4172: returning address of local variable or temporary: a

为什么如果我做std::vector<int> a[2]静态我解决了警告?

static std::vector<int> a[2];

是否有另一种方法可以从函数返回数组而没有悬空指针警告?

谢谢你。

4

2 回答 2

0

它有效,但我收到此警告:

具有自动存储持续时间的变量会在声明它们的范围结束时自动销毁。

您返回指向自动数组元素的指针,因此返回的指针将无效。通过这种无效指针间接的行为将是未定义的。

为什么如果我将 std::vector a[2] static 我解决了警告?

因为如果将其设为静态,则该变量具有静态存储持续时间而不是自动存储持续时间。因此,数组不会在其作用域的末尾被销毁,因此指向其元素的指针即使在函数返回后仍将保持有效。

是否有另一种方法可以从函数返回数组而没有悬空指针警告?

在 C++ 中无法返回数组。然而,可以返回类对象,并且类可以包含数组作为成员。因此,您可以返回包含要返回的数组的类的实例。标准库中有此类数组包装类的模板。它被称为std::array

例子:

std::array<std::vector<int>, 2> getx()
{
   return {
       std::vector<int>{0},
       std::vector<int>{1},
   };
}
于 2022-02-01T16:12:29.337 回答
0

为什么如果我将 std::vector a[2] static 我解决了警告?

静态 std::vector a[2];

您可能不会返回指向具有自动存储持续时间的本地数组的指针,因为该数组在退出函数后将不再存在,因此返回的指针将无效。

但是您可能会返回一个指向具有静态存储持续时间的本地数组的指针,因为它在退出函数后将是活动的。

然而实际上没有必要精确地处理一个数组。使用std::vector<std::vector<int>>std::array<std::vector<int>, 2>作为函数的返回类型。

例如

std::vector<std::vector<int>> getx()
{
   std::vector<std::vector<int>> a( 2 );

   a[0].push_back(0);
   a[1].push_back(1);

   return a;
}

或者

std::array<std::vector<int>, 2> getx()
{
   std::array<std::vector<int>, 2> a;

   a[0].push_back(0);
   a[1].push_back(1);

   return a;
}
于 2022-02-01T16:15:05.130 回答