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