2012-01-20 32 views
4

比方說,我這樣做:引用與傳遞函數指針的值,並使用刪除指針鏈

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

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

現在,如果我離開參考操作,也不會完全一樣的事情在func中完成?無論哪種方式,你在堆中訪問相同的int值,所以一種方式比另一種更可取?如果僅當您嘗試更改指針所指向的位置時才使用引用運算符?我對此並不清楚,我的教授也沒有幫助。 :(

我的其他問題與delete運算符做比方說,我有:

int** ptr = new int*; 

ptr* = new int; 

如果我想解除分配在堆中分配的所有內存,可能我只是在PTR使用刪除一次或者我會刪除PTR *然後PTR?

太謝謝你了。

回答

4

通過引用傳遞指針沒有任何好處,但它也沒有傷害。當然,通過引用傳遞指針可以讓你改變指針指向的位置,如果你想要的話。你可以用雙指針完成同樣的事情。

你的情況需要兩次刪除。這裏的記憶將是什麼樣子你的電話後:

// 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 *四個字節。

+0

1000倍比我的教授更有幫助。謝謝! – JamesGold

3

在你的第一個例子中,真的沒有區別。參考文獻用於修改和也避免了複製(這沒有按」在指針的情況下真的很重要)

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

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

+0

啊,謝謝你抓到語法錯誤。 – JamesGold