我无法理解如何在下面的程序的第二个类中编写析构函数:
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;
}
答案 0 :(得分:1)
首先在构造函数中分配后,最好在数组中保留NULL。
int arr_size; // you need to define this for the reference in destructor
Second(int size)
{
arr_size = size;
arr = new First*[size]; // Please bear with my use of new
for (int i = 0; i < size; i++)
arr[i] = NULL;
}
然后,在析构函数中,只有当元素不是NULL时才删除元素。
~Second()
{
for(int i = 0; i < arr_size; i++)
if (arr[i])
delete arr[i];
delete[] arr;
}
答案 1 :(得分:1)
在我发现的所有类似问题中,数组的每个元素都动态分配一个值,使用new:
arr[i] = new First();
。但是,这里为元素分配指向对象的指针的值,该对象是函数的参数。那么,如果析构函数逐个删除每个元素然后删除数组,还是删除数组呢?
那,我们无法回答。 Second
是否拥有传递给.add()
的对象的所有权,如果是,那么它们是如何分配的?
如果它不取得所有权,只需删除数组就足够了,该数组应该由std::unique_ptr
为您管理。
如果确实需要所有权,那么.add()
的参数应该是具有正确所有权 - 语义和删除的智能指针。然后,您的数组应该是由std::unique_ptr
管理的智能指针数组。
在任何一种情况下,如果你正确使用智能指针,默认的dtor就可以了。