参照の削除 質問する

参照の削除 質問する

これは有効ですか?許容される慣行ですか?

typedef vector<int> intArray;

intArray& createArray()
{
    intArray *arr = new intArray(10000, 0);

    return(*arr);
}


int main(int argc, char *argv[])
{

    intArray& array = createArray();

    //..........

    delete &array;

    return 0;
}

ベストアンサー1

コードの動作は、意図した動作になります。ここで問題となるのは、プログラミングとはコンパイラが処理できるように何かを書くことだと考えているかもしれませんが、他のプログラマ (または将来の自分) が理解し、保守できるものを書くことも同じくらい重要だということです。多くの場合、あなたが提供したコードは、コンパイラにとってはポインターを使用するのと同等ですが、他のプログラマにとっては、潜在的なエラーの原因となるだけです。

参照は、別の場所で別の方法で管理されているオブジェクトへのエイリアスとして意図されています。一般に、 に遭遇すると人々は驚きますdelete &ref。また、ほとんどの場合、プログラマーは参照のアドレスに対して を実行する必要があるとは予想していませんdelete。そのため、将来誰かが 関数を呼び出して削除を忘れ、メモリ リークが発生する可能性があります。

ほとんどの場合、スマート ポインターを使用するとメモリをより適切に管理できます ( std::vectors などの他の高レベル構造を使用できない場合)。ポインターを参照の背後に隠すと、返された参照でスマート ポインターを使用することが難しくなり、ユーザーがインターフェイスを操作するのが難しくなります。

最後に、参照の良いところは、コード内で参照を読むときに、知るオブジェクトの存続期間はどこか別の場所で管理されており、それについて心配する必要はないということです。ポインターの代わりに参照を使用すると、基本的に単一のソリューション (以前の C ではポインターのみ) に戻り、突然、すべての参照に対して、メモリをその場所で管理する必要があるかどうかを判断するための特別な注意を払う必要があります。つまり、より多くの労力と、メモリ管理について考える時間が増え、実際の問題を解決することについて心配する時間が減るということです。通常とは異なるコードによる余分な負担により、人々はポインターでメモリ リークを探すことに慣れ、参照からは何も期待しなくなります。

簡単に言うと、メモリを参照によって保持すると、メモリを処理する必要性がユーザーから隠され、メモリを正しく処理することが難しくなります。

おすすめ記事