Mat*_*gan 89 c++ pointers reference
在哪种情况下你想在c ++中使用这种性质的代码?
void foo(type *&in) {...}
void fii() {
type *choochoo;
...
foo(choochoo);
}
Run Code Online (Sandbox Code Playgroud)
Dav*_* Z. 131
如果您需要修改指针而不是指针指向的对象,您可能希望通过引用传递指针.
这类似于使用双指针的原因; 使用对指针的引用比使用指针稍微安全一些.
fre*_*low 62
50%的C++程序员喜欢在删除后将其指针设置为null:
template<typename T>
void moronic_delete(T*& p)
{
delete p;
p = nullptr;
}
Run Code Online (Sandbox Code Playgroud)
如果没有引用,您只会更改指针的本地副本,而不会影响调用者.
Ant*_*ine 14
大卫的答案是正确的,但如果它仍然有点抽象,这里有两个例子:
您可能希望将所有释放的指针归零,以便更早地捕获内存问题.你做的C风格:
void freeAndZero(void** ptr)
{
free(*ptr);
*ptr = 0;
}
void* ptr = malloc(...);
...
freeAndZero(&ptr);
Run Code Online (Sandbox Code Playgroud)
在C++中也可以这样做,你可能会这样做:
template<class T> void freeAndZero(T* &ptr)
{
delete ptr;
ptr = 0;
}
int* ptr = new int;
...
freeAndZero(ptr);
Run Code Online (Sandbox Code Playgroud)处理链表时 - 通常只是表示为指向下一个节点的指针:
struct Node
{
value_t value;
Node* next;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当您插入空列表时,您必须更改传入指针,因为结果不再是NULL指针.这是一种从函数修改外部指针的情况,因此它将在其签名中引用指针:
void insert(Node* &list)
{
...
if(!list) list = new Node(...);
...
}
Run Code Online (Sandbox Code Playgroud)这个问题有一个例子.
我不得不使用这样的代码来提供函数来为传入的指针分配内存并返回它的大小,因为我公司使用STL"对象"给我
int iSizeOfArray(int* &piArray) {
piArray = new int[iNumberOfElements];
...
return iNumberOfElements;
}
Run Code Online (Sandbox Code Playgroud)
它不是很好,但必须通过引用传递指针(或使用双指针).如果不是,则将内存分配给指针的本地副本(如果它通过值传递,这会导致内存泄漏).