例では問題ありません。a[0]
とb[0]
は異なるメモリ位置にある異なるオブジェクトであり、一方を破棄しても他方には影響しません。
これnew
は赤いニシンです。次のコードは同じように機能します。
name o;
name a = o;
{
name b = o;
}
a;
name
つまり、値によってコピーすると、完全に異なるコピーが作成されます。allなどの組み込み型にint
も値セマンティクスがあります。
このコードは、o
値のセマンティクスがない場合にのみ問題が発生します。たとえば、リソース ハンドルが含まれていて、リソース ハンドルを複製するためのコピー コンストラクターおよび代入演算子コードが含まれていない場合などです。
次に、コピーo
すると、そのリソースで同じハンドルを持つ 2 つのオブジェクトが作成され、o
のデストラクタがリソースを解放すると、ダングリング コピーが残ります。
これらの問題を回避するには、通常、すべてのクラスを値のセマンティクスを持つように設計することをお勧めします。クラスが複製できないリソースのハンドルを持っている場合、不注意によるコピーを防ぐために、クラスのコピー コンストラクターと代入演算子を無効にする必要があります。実際、リソース ハンドルは、リソース ハンドル用に設計されたクラスによって保持される必要があります。
これは、「3 のルール」(C++11 以降では「5 のルール」または「0 のルール」) と呼ばれることもあります。