Должен ли я освободить динамический массив (выделен в конструкторе) в конструкторе копирования и/или операции присваивания?Выделение динамического массива (оператор присваивания против конструктора копирования)
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
в конструкторе копирования, оператор присваивания, оба или ни один?
'Test & operator = (const Test & other) : n (other.n)' compiled? И да, вы должны. –
@ LuchianGrigore нет, я набрал его без компиляции (у меня нет компилятора на компьютере, с которого я просматриваю SO). Спасибо, что заметили! –
@ LuchianGrigore Но почему Application Verifier не обнаруживает утечек памяти в обоих случаях? Разве это не заслуживающий доверия инструмент? –