我因删除动态分配的int数组而陷入困境。 我有一个析构函数,我试图使用循环来删除数组的所有元素,最后删除它。 我在http://rextester.com/OTPPRQ8349上有代码 谢谢!
class MyClass
{
public:
int _a;
int* c;
int fRozmiar;
static int fIlosc;
MyClass() //default constructor
{
_a=0;
c = new int [9];
for(int i = 0; i<=9; i++)
{
c[i] = 1;
}
fIlosc++;
}
MyClass(int a1, int c1) // parametrized constructor
{
_a=a1;
c = new int [c1];
for(int i = 0; i<=c1; i++)
{
c[i] = rand();
}
fIlosc++;
}
MyClass(const MyClass &p2) // copy constructor
{
_a =p2._a;
c = p2.c;
fRozmiar = p2.fRozmiar;
fIlosc = fIlosc;
fIlosc++;
}
~MyClass(); // destructor
static int getCount() {
return fIlosc;
}
};
//Initialize static member of class
int MyClass::fIlosc = 0;
MyClass::~MyClass()
{
for(int i = 0; i<sizeof(c); ++i)
{
delete[] c[i];
}
delete[] c;
fIlosc--;
}
int main()
{
}
答案 0 :(得分:4)
删除for循环,但保留delete[] c
之后。
每个int
都不需要删除,因为它们不会动态分配。如果你需要删除它们,那么for循环就不会起作用了:sizeof(c)
不是数组的大小,而delete[]
应该是delete
。< / p>
答案 1 :(得分:3)
代码中存在几个问题。
首先,析构函数中的循环必须继续。如果您没有new
,请不要delete
。
其次,N
元素数组的循环应为for (int i = 0; i < N; ++i)
。请注意,测试为i < N
,而非i <= N
。当前写入的循环离开数组的末尾。那不好。
第三,复制构造函数复制指针。当第一个对象超出范围时,它的析构函数会删除该数组;当副本超出范围时,它的析构函数也删除数组。再次,不好。复制构造函数必须复制该数组。为了做到这一点,类需要还存储数组元素的数量。