簡體   English   中英

如果我們使用指針返回 function 的局部變量的地址,使用 function 后是否需要刪除指針?

[英]If we return address of local variable of function using pointer, do we need to delete the pointer after using that function or not?

如果我在下面代碼的注釋中不使用delete ptr ,那么它會導致 memory 泄漏嗎?

int *create(){
    int a;
    int *a_ptr{&a};
    return a_ptr;
}
int main(){
    int *ptr = {nullptr};
    ptr = create();
    //here
    return 0;
}

實際上,您返回指向 object 的指針,該指針在create function 結束執行后被銷毀。 int a; 在堆棧上創建,因此 a_ptr 指向堆棧上的某個位置。 在返回期間,堆棧上的所有對象都被銷毀,並且只剩下 a_ptr 作為值。

不,您沒有 memory 泄漏,但main() function 中的ptr無效,因為指向不存在的 object。

main() scope 中,您初始化了指向nullptr的指針,而沒有分配任何空間(您沒有使用new關鍵字)。

create() function 中,您聲明了一個 int 而不初始化它(它可以有任何值),然后您聲明了一個a_ptr指向a的引用。 When the code exits from the create() function scope, the variable a is out of scope and those memory cells will be marked as unused . 因此,當返回的指針被分配給main() scope 中的ptr時,它將指向未使用的 memory 並且每當您使用此指針時都會導致未定義的行為

本質上,指針已經指向nullptr並且您不必delete它,因為您沒有為指針分配任何空間並且您沒有什么要刪除的。

不,您只能deletenew創建的指針。 永遠不要刪除指向局部變量的指針。 但是,您的代碼具有未定義的行為,這應該是您最關心的問題。

create()返回時,它的局部變量a的生命周期將結束,任何指向它的指針/引用都將變得無效。 訪問這樣的無效指針會導致未定義的行為,這通常表現為分段錯誤。 切勿從 function 返回指向局部變量的指針或引用。


一種選擇是實際new您返回的指針:

int *create(){
    return new int{0};
}

int main(){
    int *ptr = create();

    delete ptr;
}

不過我不推薦這個。 在現代 C++ 中,您可以而且應該避免使用new / delete / new[] / delete[]並酌情選擇智能指針向量

如果我在下面代碼的注釋中不使用 delete ptr,那么它會導致 memory 泄漏嗎?

沒有。具有自動存儲持續時間的變量在 go 超出 scope 時會自動銷毀。 示例中沒有 memory 泄漏。

但是,如果您確實刪除了 ptr,那么程序的行為將是未定義的。 那是因為你只能delete你用new分配的東西。

即使您只是間接通過指針,程序也會未定義。 返回的指針總是無效的,不能用它做任何有用的事情。

暫無
暫無

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

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