簡體   English   中英

function 返回指針 c++ 的問題

[英]Problem with the function returning a pointer c++

我調用 function 當我想讀取結果時返回一個指針兩次,第一個被第二個覆蓋

int *ip1Array = new int[4]; 
int *ip2Array = new int[4];

ip1Array = ipSplit(4);
ip2Array = ipSplit(2);

int *ipSplit(int ip)
        {
            static int ipTab[4];

            for (int i = 0; i <= ip; i++) {
                ipTab[i] = ip
            }

            return ipTab;
        }

這只是一段非常簡化的代碼。 問題是第一個 function 調用的結果被第二個調用覆蓋。 如何解決?

它沒有被覆蓋,兩個指針都指向同一個東西:

static int ipTab[4];
int *ip1Array = new int[4];

這定義了一個指針。 您已將其初始化為指向動態數組。

 ip1Array = ipSplit(4);

這個賦值會覆蓋之前的指針值。 由於先前的值是指向動態數組的唯一指針,因此不再指向它,並且不能再刪除它。 這稱為 memory 泄漏。 不要這樣做。


 static int ipTab[4];

static意味着該變量在 function 的所有調用中都是相同的。 對 function 的每次調用都將返回指向同一數組(的第一個元素)的指針。

 ip1Array = ipSplit(4); ip2Array = ipSplit(2);

這兩個 arrays 都指向由 function 返回的相同數組的(第一個元素)。 並且兩個動態 arrays 已經泄露。


 ip1Array = ipSplit(4);

您使用參數 4 調用 function。

 static int ipTab[4];

該數組有 4 個元素。

 for (int i = 0; i <= ip; i++) {

您可以通過索引 0、1、2、3、4 訪問。 數一數。 您可以訪問 5 個不同的索引。 您訪問數組的邊界之外,程序的行為是未定義的。 不要這樣做。


如何解決?

  • 不要使用擁有裸指針。
  • 不要在他們的范圍之外訪問 arrays。
  • 如果不希望所有 arrays 相同,則不要使用static

由於 arrays 的大小恆定且很小,您可以使用std::array

auto
ipSplit(int ip)
{
    assert(ip <= 4);
    std::array<int, 5> ipTab{};
    for (int i = 0; i <= ip; i++) {
        ipTab[i] = ip
    }
    return ipTab;
}

// usage
auto ip1Array = ipSplit(4);
auto ip2Array = ipSplit(2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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