Return 在 C++ 中没有获得悬挂指针的数组

Return an array without getting a Dangling pointer as result in C++

我想 return 来自 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];

是否有另一种方法 return 从函数中获取数组而没有悬挂指针警告?

谢谢。

It works but I get this Warning:

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

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

Why if i made std::vector a[2] static I solve the warning?

因为如果你把它设为静态,那么变量有静态存储时间而不是自动存储时间。因此,数组不会在其范围的末尾被销毁,因此即使在函数 returns.

之后指向其元素的指针仍将有效

Is there another way to return an array from a function without having dangling pointers warnings?

无法在 C++ 中 return 数组。然而,return class 对象是可能的,并且 classes 可以包含数组作为成员。因此,您可以 return 一个 class 的实例,其中包含您想要 return 的数组。标准库中有一个用于此类数组包装器 class 的模板。它被称为 std::array

示例:

std::array<std::vector<int>, 2> getx()
{
   return {
       std::vector<int>{0},
       std::vector<int>{1},
   };
}

Why if i made std::vector a[2] static I solve the warning?

static std::vector a[2];

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

但是你可以 return 指向具有静态存储持续时间的本地数组的指针,因为它在退出函数后仍然存在。

然而实际上并不需要精确地处理一个数组。使用 std::vector<std::vector<int>>std::array<std::vector<int>, 2> 作为函数的 return 类型。

例如

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