通过引用和值传递指向函数的指针,并在指针链上使用delete

时间:2012-01-20 19:58:09

标签: c++ pointers

让我说我这样做:

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?

非常感谢你。

2 个答案:

答案 0 :(得分: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 *分配的四个字节需要删除一个。

答案 1 :(得分:3)

在你的第一个例子中,确实没有区别。引用用于修改,也用于避免复制(在指针的情况下,这并不重要)。

在第二个问题中,您没有正确的语法(*ptr而不是ptr*),但是,您必须单独删除数组及其内容。

您可以使用标准模板库类型(shared_ptrunique_ptr)在删除容器时自动删除包含的对象。