2012-01-20 34 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