Reason to Pass a Pointer by Reference in C++?

在什么情况下,您希望在 c + + 中使用这种性质的代码?

void foo(type *&in) {...}


void fii() {
type *choochoo;
...
foo(choochoo);
}
121827 次浏览

You would want to pass a pointer by reference if you have a need to modify the pointer rather than the object that the pointer is pointing to.

这与使用双指针的原因类似; 使用对指针的引用比使用指针稍微安全一些。

我不得不使用这样的代码来提供函数来分配内存给传入的指针,并返回它的大小,因为我的公司“对象”给我使用 STL

 int iSizeOfArray(int* &piArray) {
piArray = new int[iNumberOfElements];
...
return iNumberOfElements;
}

这并不好,但是指针必须通过引用传递(或者使用双指针)。如果没有,内存将被分配给指针的本地副本,如果它是通过导致内存泄漏的值传递的。

另一种可能需要这样做的情况是,如果您有 stl 指针集合并希望进行更改 例如 c + + 98中的 _ each。

struct Storage {
typedef std::list<Object*> ObjectList;
ObjectList objects;


void change() {
typedef void (*ChangeFunctionType)(Object*&);
std::for_each<ObjectList::iterator, ChangeFunctionType>
(objects.begin(), objects.end(), &Storage::changeObject);
}


static void changeObject(Object*& item) {
delete item;
item = 0;
if (someCondition) item = new Object();
}


};

否则,如果您使用 ChangeObject (Object * item)签名,您有指针的副本,而不是原始的一个。

大卫的回答是正确的,但是如果还是有点抽象的话,这里有两个例子:

  1. 你可能需要清零所有被释放的指针来提前捕捉内存问题。 C 风格:

    void freeAndZero(void** ptr)
    {
    free(*ptr);
    *ptr = 0;
    }
    
    
    void* ptr = malloc(...);
    
    
    ...
    
    
    freeAndZero(&ptr);
    

    在 C + + 中,你也可以这样做:

    template<class T> void freeAndZero(T* &ptr)
    {
    delete ptr;
    ptr = 0;
    }
    
    
    int* ptr = new int;
    
    
    ...
    
    
    freeAndZero(ptr);
    
  2. When dealing with linked-lists - often simply represented as pointers to a next node:

    struct Node
    {
    value_t value;
    Node* next;
    };
    

    在这种情况下,当您插入到空列表时,您必须更改传入指针,因为结果不再是 NULL指针。这是一种从函数中修改外部指针的情况,这样它的签名中就会有一个对指针的引用:

    void insert(Node* &list)
    {
    ...
    if(!list) list = new Node(...);
    ...
    }
    

There's an example in this question.

50% 的 C + + 程序员喜欢在删除后将指针设置为 null:

template<typename T>
void moronic_delete(T*& p)
{
delete p;
p = nullptr;
}

如果没有引用,您将只是更改指针的本地副本,而不会影响调用方。

一个例子是,当你写一个解析器函数并传递给它一个要读取的源指针时,如果该函数应该将该指针向前推到解析器正确识别的最后一个字符后面。使用对指针的引用可以清楚地表明函数将移动原始指针以更新其位置。

In general, you use references to pointers if you want to pass a pointer to a function and let it move that 原创的 pointer to some other position instead of just moving a copy of it without affecting the original.