让我说我这样做:
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?
非常感谢你。
答案 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_ptr
,unique_ptr
)在删除容器时自动删除包含的对象。