次の正しいコピーを作成するために、コピー コンストラクターを呼び出す必要があるクラスがあるとします。
struct CWeird
{
CWeird() { number = 47; target = &number; }
CWeird(const CWeird &other) : number(other.number), target(&number) { }
const CWeird& operator=(const CWeird &w) { number = w.number; return *this; }
void output()
{
printf("%d %d\n", *target, number);
}
int *target, number;
};
ここでの問題は、メモリを再割り当てするときに CArray がその要素に対してコピー コンストラクタを呼び出さないことです (古いメモリから新しいメモリへの memcpy のみ)。たとえば、次のコードです。
CArray<CWeird> a;
a.SetSize(1);
a[0].output();
a.SetSize(2);
a[0].output();
結果は
47 47
-572662307 47
わかりません。std::vector は同じオブジェクトを適切にコピーでき、CArray はできないのはなぜですか? ここでの教訓は何ですか?明示的なコピー コンストラクターを必要としないクラスのみを使用する必要がありますか? それとも、重大なことに CArray を使用するのは悪い考えですか?