我在理解如何在以下程序的第二类中编写析构函数时遇到了麻烦:
class First
{
// Assume this is a virtual class
};
class Second
{
private:
int index;
First **arr;
public:
Second(int size)
{
index = 0;
arr = new First*[size]; // Please bear with my use of new
}
~Second() {}
void add(First *f)
{
arr[index++] = f;
}
};
在我发现的所有类似问题中,使用new这样的方法为数组的每个元素动态分配一个值:arr[i] = new First();
。但是,此处为元素分配了指向对象的指针的值,该对象是函数的参数。那么,析构函数应该先删除每个元素然后删除数组,还是足以删除数组?
~Second()
{
for(int i = 0; i < index; ++i) delete[] arr[i]; // Is this necessary?
delete[] arr;
}
在我发现的所有类似问题中,使用new这样的方法为数组的每个元素动态分配一个值:
arr[i] = new First();
。但是,此处为元素分配了指向对象的指针的值,该对象是函数的参数。那么,析构函数应该先删除每个元素然后删除数组,还是足以删除数组?
那,我们不能回答。是否Second
拥有对传递给的对象的所有权.add()
,如果是,则如何分配它们?
如果没有所有权,只需删除该阵列就足够了,并且应该通过std::unique_ptr
这样做来管理该阵列。
如果确实拥有所有权,则该参数.add()
应该是具有正确的所有权语义和删除器的智能指针。然后,您的数组应该是这些智能指针的数组,由进行管理std::unique_ptr
。
无论哪种情况,如果您正确使用智能指针,都可以使用default-dtor。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句