C++ 0505 析构函数

析构函数

构造函数确保一个对象被正确创建并初始化。与之相反,析构函数确保一个对象销毁前被正确清理。

生成的析构函数

如果一个类的成员拥有一个析构函数,则在包含这个成员的对象销毁时这个析构函数会被调用。

析构函数和自由空间

析构函数概念上很简单,但他是大多数最有效的C++编程技术的基础。
基本思想是:
无论一个类对象需要使用那些资源,这些资源都要在构造函数中获取。
在对象的声明周期中,他可以释放资源并获得新的资源。
在对象的声明周期结束后,析构函数释放对象拥有的所有资源。


Shape* fct()
{
   Text tt{Point{200, 200}, "Annemarie"};
   // ..
   Shape* p = new Text{Point{100, 100},"Nicholas"};
   return p;
}

void f()
{
    Shap* q = fct();
    // ...
    delete q;
}

实际上,Shape的析构函数是virtual的,这就是问题的关键。当我们使用delete q时,
delete q会调用Shape的析构函数~Shape。但是,~Shape()是virtual的,因此使用virtual调用机制

注意,析构函数是通过delete来隐式或间接调用的,不会直接调用,这样能省去很多麻烦的工作。


访问元素

class vector
{
    int sz;      // 大小
    double* elem; // 指向元素的指针
public:
    vector(int s):sz{s}, elem{new double[s]} {/*...*/} //构造函数
    ~vector() {delete[] elem;} //析构函数

    int size() const{return sz;} //当前大小
    double get(int n) const{return elem[n];} //访问:读
    void set(int n, double v) {elem[n]=v;} //访问:写
};

vector v(5);
for (int i=0; i<v.size(); ++i)
{
    v.set(i,1.1*i);
    cout << "v[" << i << "]" << v.get(i) << '\n';
}
v[0] = 0
v[1] = 1.1
v[2] = 2.2
v[3] = 3.3
v[4] = 4.4


指向类对象的指针

vector* f(int s)
{
    vector* p = new vector(s); //在自由空间中分配一个vector
    //填充 *p
    return p;
}

void ff()
{
    vector* q = f(4);
    //使用 *q
    delete q; //在自由空间中释放vector
}

注意,当我们delete一个vector时,它的析构函数会被调用。

vector* p = new vector(s); //在自由空间中分配一个vector
delete p; //释放

当在自由空间中创建一个vector时,new运算符:
首先为vector分配内存。
然后,调用vector的构造函数来初始化vector;构造函数为vector的元素分配内存,并初始化这些元素。

当删除vector时,delete运算符:
首先调用vector的析构函数;这个析构函数调用元素的析构函数(如果他们有析构函数),然后释放元素使用的内存。
然后,释放vector使用的内存。

vector<vector<double>>* p = new vector<vector<double>>(10);
delete p;


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值