簡體   English   中英

返回指針(數組)時可能的內存泄漏(C ++)

[英]Possible memory leak when returning pointer (array) (C++)

考慮一下C ++中的代碼片段:

int *foo() {
    int *y = new int[1000];
    return y;
}

int main() {
    int *x = new int [1000];
    x = foo();
    delete[] x;
    return 0;
}

創建x ,它指向一個內存地址。 調用foo() ,將創建一個新的指針y ,指向另一個地址,但隨后將x設置為y的地址。 因此,刪除該地址后,將釋放新地址的內存,但x原來的地址將被泄漏。 那是對的嗎?

此外,在調用foo()之前,我通過調用delete[] x對代碼段進行了少許更改,並且該代碼仍已編譯並運行:

int *foo() {
    int *y = new int[1000];
    return y;
}

int main() {
    int *x = new int [1000];
    delete[] x;
    x = foo();
    delete[] x;
    return 0;
}

這是否意味着我防止了泄漏? 最后一個問題,如果我在聲明x時不初始化x ,但不過早刪除它,它是否指向將泄漏的內存? 如下所示:

int *foo() {
    int *y = new int[1000];
    return y;
}

int main() {
    int *x;
    x = foo();
    delete[] x;
    return 0;
}

附帶說明一下,我知道使用向量和/或唯一指針更安全,但是我對上面代碼的功能感到好奇,特別是在聲明但稍后初始化指針時會發生什么。

創建x時,它指向一個內存地址。 調用foo()時,將創建一個新的指針y,指向另一個地址,但隨后將x設置為y的地址。 因此,刪除該地址后,將釋放新地址的內存,但x原來的地址將被泄漏。 那是對的嗎?

是。

這是否意味着我防止了泄漏?

是。

最后一個問題,如果我在聲明x時不初始化x,但不過早刪除它,它是否指向將泄漏的內存?

沒有。

附帶說明一下,我知道使用向量和/或唯一指針更安全

絕對。 即使沒有這些代碼可能是更清晰了很多關於內存的所有權,使得你的問題就不會出現,甚至,但它是真的,切換到標准箱/智能指針會就在源頭上解決問題,我強烈建議這一點。


tl; dr:到目前為止,您對所有事情都是正確的

在上面的代碼段中:

int *x = new int [1000];
x = foo();
delete[] x;

您為x分配了一個數組指針,然后通過為其分配foo()來“壓縮”它。 如果您使用的是垃圾回收語言(或使用智能指針),則在這種情況下將回收內存。

暫無
暫無

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

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