我应该在复制构造函数和/或赋值运算符中取消分配动态数组(在构造函数中分配)吗?
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[]
在赋值运算符实现中使用数组(因为在构造被分配的对象期间它已经被分配到某个地方)。而且我确实认为您不需要在复制构造对象时释放数组,因为它尚未构造。
delete[]
问题是,在 Application Verifier 下运行上面的应用程序不会显示内存泄漏,无论是否存在operator=
。应用程序在这两种情况下都可以正常运行。
那么,我应该delete[] xs
在复制构造函数、赋值运算符中,还是两者都没有?