【发布时间】:2018-09-12 01:23:58
【问题描述】:
我无法理解如何在下面程序的第二类中编写析构函数:
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;
}
【问题讨论】:
-
arr是new[]-ed,所以应该是detele[]-ed。是arr[i]new[]-ed 吗? -
将
First **arr替换为std::vector<First*>,或者,如果Second拥有Firsts,则替换为std::vector<std::unique_ptr<First>>。 -
这取决于指针
f是如何创建的,new、new[]、malloc或&variable?还有关于调用add的代码是否会保留所有权并稍后删除对象。 “把自己画到角落里”是我想到的一句话。 -
@DimK - 它必须是对
delete、delete[]、free或 nothing 的匹配调用。但是如果你不知道调用者做了什么,你就不能写它。 :-) -
不,我不知道没有其他人。您说过您不确定该指针是如何分配的。为什么你不确定你是不是做这件事的人?如果您正在编写整个程序,您需要确定哪些指针是拥有它们指向的对象,哪些不是。在任何给定的时刻,每个对象都必须有一个拥有指针(尽管不同的指针可能在不同的时刻拥有它,但最好避免这种情况)。 您分配该角色。
arr拥有指针数组。什么拥有数组元素指向的对象?
标签: c++ arrays class pointers destructor