析构函数和释放函数有什么区别?

时间:2016-11-05 00:14:48

标签: c++ oop destructor object-lifetime

此代码中的析构函数和DeAllocate函数有什么区别?

我不明白它们看起来和我一样。他们做同样的事情,为什么你需要像DeAllocate这样的功能?析构函数具有自动调用的优点,但DeAllocate不会。

#include <iostream>
using namespace std;

const int SIZE=5;

class ARRAY_CLASS
{
public:
    ARRAY_CLASS();//default constructor
    ~ARRAY_CLASS(); //destructor
    void Add(int); //mutator
    void Print(); //accessor
    int * Get_Address(); //accessor
    void DeAllocate(); //mutator
private:

    int *A;
    int count;
};

ARRAY_CLASS::ARRAY_CLASS()
{
    cout<<"Default constructor has been called\n";
    A = new int[SIZE];
    count = 0;
}


ARRAY_CLASS::~ARRAY_CLASS()
{
    cout<<"The Destructor has been Called!\n";
    delete [ ] A;
    A=0;
    count = 0;
}

void ARRAY_CLASS::Add(int item)
{
    if (count<SIZE)
        A[count++]=item;
    else
        cout<<"Array Full\n";
}
void ARRAY_CLASS::Print()
{
    for(int i=0; i<count; i++)
        cout<<"A[i] = "<<A[i]<<endl;
}

int * ARRAY_CLASS::Get_Address()
{
    return A;
}

void ARRAY_CLASS::DeAllocate()
{
    delete [ ] A;
    A = 0;
    count = 0;
}

int main()
{

    ARRAY_CLASS B;

    B.Add(1);
    B.Add(2);
    B.Add(3);
    B.Add(4);
    B.Add(5);

    B.Print();

    ARRAY_CLASS A = B;

    cout<<"A holds address location = "<<A.Get_Address()
    <<" and B holds address location "<<B.Get_Address()<<endl;

    B.DeAllocate();
    A.Print();

    return 0;
}

2 个答案:

答案 0 :(得分:4)

确实可以重写析构函数:

ARRAY_CLASS::~ARRAY_CLASS()
{
    cout<<"The Destructor has been Called!\n";
    DeAllocate();
}

区别在于:

  • 析构函数在销毁时调用(当离开创建对象的作用域时,或者当对象被freestore对象删除时,自动为本地对象调用)。对象被销毁后,该对象不再存在。

  • 当您调用DeAllocate();时,将释放数组的内存并更改对象的状态,但其所有成员和ARRAY_CLASS对象本身仍然存在。

答案 1 :(得分:3)

当对象本身被删除时,析构函数将会发生。

在您发布的示例中,您只需将该功能重命名为其他内容,例如void ARRAY_CLASS::ClearArray()而不是void ARRAY_CLASS::DeAllocate()。你所做的只是释放A使用的内存,而不是破坏整个对象。