考虑以下代码:
class Foo
{
Monster* monsters[6];
Foo()
{
for (int i = 0; i < 6; i++)
{
monsters[i] = new Monster();
}
}
virtual ~Foo();
}
什么是正确的析构函数?
this:
Foo::~Foo()
{
delete [] monsters;
}
or this:
Foo::~Foo()
{
for (int i = 0; i < 6; i++)
{
delete monsters[i];
}
}
我目前有最上面的构造函数,一切都工作正常,但当然我看不到它是否碰巧泄漏......
就我个人而言,考虑到我正在做的事情,我认为第二个版本更加合乎逻辑。无论如何,“正确”的方法是什么?
delete[] monsters;
不正确,因为monsters
不是指向动态分配数组的指针,它is指针数组。作为类成员,当类实例被销毁时,它会自动被销毁。
您的另一种实现是正确的,因为数组中的指针确实指向动态分配Monster
对象。
请注意,使用当前的内存分配策略,您可能需要声明自己的复制构造函数和复制赋值运算符,以便无意的复制不会导致重复删除。 (如果你想防止复制,你可以将它们声明为私有,而不是实际实现它们。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)