August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
现在,我们知道如何为一个vector保存元素。我们简单地为这些元素在自由空间中分配足够的空间,并且通过一个指针来访问它们:
这样,sz就是元素的数量。我们在构造函数中初始化它,用户可以通过调用size()得到vector中的元素数量。在构造函数中使用new来分配元素空间,从自由空间返回的指针被保存在成员指针elem中。
注意,我们将元素初始化为它们的默认值(0.0)。标准库vector就是这样做的,因此我们认为在一开始最好也这样做。
不幸的是,我们第一个vector版本会泄漏内存。在构造函数中,它使用new来为元素分配内存。遵循在12.4节中描述的规则,我们必须保证使用delete释放这些内存。思考下面程序:
当我们离开函数f()时,v在自由空间中创建的元素没有释放。我们可以为vector定义一个clean_up()操作并调用它:
这段代码运行良好。但是,自由空间一个最常见的问题是人们会忘记delete。clean_up()也会产生同样问题,人们可能忘记调用它。我们可以做得更好。基本思路是令编译器知道一个可以做与构造函数相反事情的函数,就像它了解构造函数一样。必然地,这个函数被称为析构函数(destructor)。就像一个类对象创建时会隐式调用构造函数一样,当一个对象离开其作用域时会隐式调用析构函数。构造函数确保一个对象被正确创建并初始化。与之相反,析构函数确保一个对象销毁前被正确清理。例如: ...