コピー コンストラクターおよび/または代入演算子で動的配列 (コンストラクターで割り当てられた) の割り当てを解除する必要がありますか?
struct Test
{
const size_t n;
int* xs;
Test(const size_t n)
: n(n)
, xs(new int[n])
{ }
Test(const Test& other)
: n(other.n)
, xs(new int[n])
{
memcpy(xs, other.xs, n * sizeof(int));
}
Test& operator=(const Test& other)
{
n = other.n;
delete[] xs;
xs = new int[n];
memcpy(xs, other.xs, n * sizeof(int));
}
~Test()
{
delete[] xs;
}
};
void main()
{
Test a(10);
Test b(a);
Test c(20);
c = b;
}
ご覧のとおりdelete[]
、代入演算子の実装で配列を使用する必要があると思います (割り当て先のオブジェクトの構築中に、配列が既にどこかに割り当てられているため)。また、オブジェクトはまだ構築されていないため、オブジェクトのコピー構築中に配列の割り当てを解除する必要はないと思います。
問題は、Application Verifier の下で上記のアプリケーションを実行すると、メモリ リークがあるかどうかに関係なく、メモリ リークが表示delete[]
されないことoperator=
です。どちらの場合でも、アプリケーションは問題なく動作します。
では、delete[] xs
コピー コンストラクター、代入演算子、またはその両方を使用する必要がありますか?