【发布时间】:2018-05-01 20:12:39
【问题描述】:
我无法删除动态分配的 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()
{
}
【问题讨论】:
-
删除必须与分配对称!您一次分配了数组,然后一次释放了它。
-
无关:
sizeof(c)不会为您提供c指向的缓冲区大小。它会给你指针的大小,地址的大小,以字节为单位。大多数时候不是很有用。 -
不相关:在复制构造函数中
c = p2.c;是一个致命错误。您现在有两个对象指向同一个分配。当析构函数为这些对象之一运行时,另一个对象的内存将消失。如果程序在尝试使用已释放内存的另一个对象上没有崩溃,那么当另一个对象被删除并尝试删除已经被删除的内存时,将会发生一些可怕的事情(可能是崩溃)。 -
无关:
fIlosc = fIlosc;将变量分配给自身。因为这个变量是静态的,所以两个对象都是一样的,所以没有必要这样做。
标签: c++