![](/img/trans.png)
[英]When we pass by reference, why do we put a variable instead of address(pointer), when calling the 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
它,因為您沒有為指針分配任何空間並且您沒有什么要刪除的。
不,您只能delete
由new
創建的指針。 永遠不要刪除指向局部變量的指針。 但是,您的代碼具有未定義的行為,這應該是您最關心的問題。
當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.