簡體   English   中英

在 C++ 中返回一個數組而不獲取懸空指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM