115

この性質のコードを C++ で使用したいのは、どのような状況ですか?

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

void fii() {
  type *choochoo;
  ...
  foo(choochoo);
}
4

6 に答える 6

172

ポインターが指しているオブジェクトではなく、ポインターを変更する必要がある場合は、参照によってポインターを渡します。

これは、二重ポインターが使用される理由と似ています。ポインターへの参照を使用する方が、ポインターを使用するよりもわずかに安全です。

于 2012-04-20T04:14:41.983 に答える
70

C++ プログラマーの 50% は、削除後にポインターを null に設定することを好みます。

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

参照がなければ、ポインターのローカル コピーを変更するだけで、呼び出し元には影響しません。

于 2013-11-25T09:51:08.450 に答える
10

このようなコードを使用して、渡されたポインタにメモリを割り当て、そのサイズを返す関数を提供する必要がありました.

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

いいことではありませんが、ポインターは参照によって渡される必要があります (または二重ポインターを使用します)。そうでない場合、ポインターが値で渡されると、ポインターのローカル コピーにメモリーが割り当てられ、メモリー リークが発生します。

于 2012-04-21T08:18:09.103 に答える
3

1 つの例は、パーサー関数を作成し、読み取り元のソース ポインターを渡す場合です。関数が、パーサーによって正しく認識された最後の文字の後ろにそのポインターをプッシュすることになっている場合です。ポインターへの参照を使用すると、関数が元のポインターを移動してその位置を更新することが明確になります。

一般に、関数にポインターを渡したい場合は、ポインターへの参照を使用し、元のポインターに影響を与えずにそのコピーを移動するのではなく、元のポインターを別の位置に移動させます。

于 2016-08-04T01:17:56.573 に答える
0

これが必要になるもう 1 つの状況は、stl コレクションのポインターがあり、stl アルゴリズムを使用してそれらを変更したい場合です。c++98 での for_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)署名を使用すると、元のポインターではなく、ポインターのコピーが作成されます。

于 2013-11-25T08:37:19.033 に答える