簡體   English   中英

通過引用和值傳遞指向函數的指針,並在指針鏈上使用delete

[英]Passing pointers to functions by reference vs. by value, and using delete on pointer chains

假設我這樣做:

void func ( int* & refptr)
{    
     *refptr = 7;
}

int* ptr = new int;
func( ptr );

現在,如果我離開引用運算符,在func中完成的事情是否完全相同? 無論哪種方式,你在堆中訪問相同的int值,所以一種方式比另一種更好? 是否只在您嘗試更改指針...指向的位置時才使用引用運算符? 我不清楚這一點,我的教授沒有幫助。 :(

我的另一個問題與刪除操作符有關。 比方說我有:

int** ptr = new int*;

ptr* = new int;

如果我想釋放堆中分配的所有內存,我可以在ptr上使用delete一次,還是必須刪除ptr *然后ptr?

非常感謝。

通過引用傳遞指針沒有任何好處,盡管它也沒有受到傷害。 當然,通過引用傳遞指針允許您根據需要更改指針指向的位置。 你可以用雙指針完成同樣的事情。

在您的情況下,您需要兩次刪除。 這是你打電話后內存的樣子:

// Memory: free
int ** ptr = new int*;
// Memory: four bytes allocated for int*
ptr* = new int;
// Memory: four bytes allocated for int*, four bytes allocated for int

對於為int分配的四個字節,需要刪除一個,為int *分配的四個字節需要刪除一個。

在你的第一個例子中,確實沒有區別。 引用用於修改並且還用於避免復制(在指針的情況下這並不重要)。

在第二個問題中,您沒有正確的語法( *ptr而不是ptr* ),但是,您必須分別刪除數組及其內容。

您可以使用標准模板庫類型( shared_ptrunique_ptr )在刪除容器時自動刪除包含的對象。

暫無
暫無

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

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