我应该在复制构造函数和/或赋值运算符中释放动态数组(分配在构造函数中)吗?动态数组解除分配(赋值运算符与复制构造函数)
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)'编译?是的,你应该。 – 2013-03-22 10:23:39
@LuchianGrigore不,我输入它没有编译(我没有在我浏览的计算机上的编译器)。感谢您的注意! – 2013-03-22 10:26:53
@LuchianGrigore但是为什么Application Verifier在两种情况下都没有显示内存泄漏?这不是一个值得信赖的工具吗? – 2013-03-22 10:27:43