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