[英]pointer function delete? and pointer to pointer crash (c++)
我是C ++的新手,我使用代碼塊
1 / 指向指針的指針 :
int **pp = new int*;
cout<<*pp<<endl;
{
int *p = new int;
pp = &p;
cout<< *pp<<endl;
}
之后,如果我寫delete pp
,則顯示“ .exe停止工作”。 我猜這是因為我嘗試刪除它指向的引用,並且不允許這樣做。 我只是讓pp
嗎? 我不能刪除它嗎? 如果我要創建許多指向指針的指針,是否不存在內存泄漏的風險?
1 / 指針功能刪除 ? 我有:
int* fct_ptr(int &a, int &b)
{
int* ptr=new int;
if (a>b)
ptr=&a;
else
ptr=&b;
return ptr;
}
如何取消分配用於fct_ptr
的指針? 編寫delete fct_ptr(int_value1, int_value2)
足夠? 但是我懷疑我的fct_ptr(int_value1, int_value2)
只是一個指針,該指針通過fct_ptr(int_value1, int_value2)
獲得了其參數的引用,例如int* a=new int; int*b=a;
int* a=new int; int*b=a;
,所以這意味着無法以這種方式刪除ptr
...因此,如果我多次調用該fct,會不會發生內存泄漏? 我可以只寫int* ptr;
而不是 int* ptr = new int*;
解決問題。 但是我想知道如何解決而不更改ptr
的聲明
伯努瓦。
您只需要確保釋放分配給new
所有內存,不必擔心指針本身。
因此,對於第一個代碼塊,當您重新分配pp
您已經存在分配的pp
一個對象的內存泄漏( new int*
),因為當您分配pp = &p
,您將永遠無法達到前一個內存對象*pp
的內存地址。指向。
規則是,對於每個new
,必須有一個delete
。 因此,如果您真的想用T* p = new T
進行聲明,則需要輸入
int **pp = new int*; //(1)
{
int *p = new int; //(2)
delete pp; //make sure (1) is deallocated, will never be reached otherwise
pp = &p;
delete p; //make sure (2) is deallocated, will never be reached otherwise
}
對於(2),變量p
僅存在於作用域中,並且只能通過它到達(2),因此您也需要在范圍中將其刪除。 如評論中所述, pp
現在指向未定義的內容。
對於第二種情況,每次調用函數fct_ptr
,都在堆棧上分配一個永遠不會被釋放的int
。 所以這里的解決方案也是
int* fct_ptr(int &a, int &b)
{
int* ptr=new int;
delete ptr;
if (a>b)
ptr=&a;
else
ptr=&b;
return ptr;
}
不過,當然,也沒有必要為哪些指針指向如果你從來沒有使用該對象分配內存。 因此,只寫int* ptr;
如果您不打算取消引用ptr
然后再確定它指向某物。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.