この性質のコードを C++ で使用したいのは、どのような状況ですか?
void foo(type *&in) {...}
void fii() {
type *choochoo;
...
foo(choochoo);
}
ポインターが指しているオブジェクトではなく、ポインターを変更する必要がある場合は、参照によってポインターを渡します。
これは、二重ポインターが使用される理由と似ています。ポインターへの参照を使用する方が、ポインターを使用するよりもわずかに安全です。
C++ プログラマーの 50% は、削除後にポインターを null に設定することを好みます。
template<typename T>
void moronic_delete(T*& p)
{
delete p;
p = nullptr;
}
参照がなければ、ポインターのローカル コピーを変更するだけで、呼び出し元には影響しません。
このようなコードを使用して、渡されたポインタにメモリを割り当て、そのサイズを返す関数を提供する必要がありました.
int iSizeOfArray(int* &piArray) {
piArray = new int[iNumberOfElements];
...
return iNumberOfElements;
}
いいことではありませんが、ポインターは参照によって渡される必要があります (または二重ポインターを使用します)。そうでない場合、ポインターが値で渡されると、ポインターのローカル コピーにメモリーが割り当てられ、メモリー リークが発生します。
1 つの例は、パーサー関数を作成し、読み取り元のソース ポインターを渡す場合です。関数が、パーサーによって正しく認識された最後の文字の後ろにそのポインターをプッシュすることになっている場合です。ポインターへの参照を使用すると、関数が元のポインターを移動してその位置を更新することが明確になります。
一般に、関数にポインターを渡したい場合は、ポインターへの参照を使用し、元のポインターに影響を与えずにそのコピーを移動するのではなく、元のポインターを別の位置に移動させます。
これが必要になるもう 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)署名を使用すると、元のポインターではなく、ポインターのコピーが作成されます。