[英]Return an array without getting a Dangling pointer as result in C++
我想從 C++ 中的 function 返回一個數組。 我做了這個簡單的代碼來嘗試實現它。
#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 我解決了警告?
static std::vector<int> a[2];
是否有另一種方法可以從 function 返回數組而沒有懸空指針警告?
謝謝你。
它有效,但我收到此警告:
具有自動存儲持續時間的變量在聲明它們的 scope 末尾自動銷毀。
您返回指向自動數組元素的指針,因此返回的指針將無效。 通過這種無效指針間接的行為將是未定義的。
為什么如果我制作 std::vector a[2] static 我解決了警告?
因為如果將其設為 static,則該變量具有 static 存儲持續時間,而不是自動存儲持續時間。 因此,該數組不會在其 scope 的末尾被銷毀,因此即使在 function 返回后,指向其元素的指針仍將保持有效。
是否有另一種方法可以從 function 返回數組而沒有懸空指針警告?
無法在 C++ 中返回數組。 但是可以返回 class 對象,並且類可以包含 arrays 作為成員。 因此,您可以返回包含要返回的數組的 class 的實例。 標准庫中有這樣的數組包裝器 class 的模板。 它被稱為std::array
。
例子:
std::array<std::vector<int>, 2> getx()
{
return {
std::vector<int>{0},
std::vector<int>{1},
};
}
為什么如果我制作 std::vector a[2] static 我解決了警告?
static std::vector a[2];
您可能不會返回指向具有自動存儲持續時間的本地數組的指針,因為該數組在退出 function 后將不再存在,因此返回的指針將無效。
但是您可能會返回一個指向具有 static 存儲持續時間的本地數組的指針,因為它在退出 function 后將處於活動狀態。
然而實際上沒有必要精確地處理一個數組。 使用std::vector<std::vector<int>>
或std::array<std::vector<int>, 2>
作為 function 的返回類型。
例如
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.