C++ 0505 析构函数
发布日期:2021-05-08 04:49:44 浏览次数:21 分类:精选文章

本文共 1541 字,大约阅读时间需要 5 分钟。

析构函数

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

生成的析构函数

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

析构函数和自由空间

析构函数概念上很简单,但他是大多数最有效的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;

 

上一篇:mongo+monstache(分片)+es数据同步-config.toml
下一篇:AntDeploy发布.net core 项目到linux并指定端口

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月04日 08时22分07秒