上机实例之vector内存分配

来源:互联网 发布:手机淘宝店的店招尺寸 编辑:程序博客网 时间:2024/05/21 09:53
            Employee.h#include<string>#include<iostream>using namespace std;class Employee{private:         string name;         string address;         string code;         float wage;public:         Employee(){cout<<" 无参构造函数被凋用 "<<endl;};         ~Employee(){cout<<" 析构函数被凋用 "<<endl;};         Employee(const Employee& e){ cout << " 拷贝构造函数被调用 " << endl; };         Employee(string name,string address,string code,float wage);         void change_name(string new_name);         void display();         float get_wage(){return wage;};         void set_wage(float wage){this->wage=wage;};};
                       Employee.cpp#include"Employee.h"#include<iostream>using namespace std;Employee::Employee(string name,string address,string code,float wage){         cout<<" 有参构造函数被调用 "<<endl;         this->name=name;         this->address=address;         this->code=code;         this->wage=wage;}void Employee::change_name(string new_name){         this->name=new_name;         cout<<" 姓名已更改 "<<endl;}void Employee::display(){         cout<<" 姓名 :"<<name<<endl;         cout<<" 地址 :"<<address<<endl;         cout<<" 邮编 :"<<code<<endl;         cout<<" 工资 :"<<wage<<endl;}

我使用 new 分配了一个大小为 3 的 Employee 数组,在 vector 中通过 pushback() em1,em2,em3 ,向其中添加了 3 个元素。

结果如下:

首先分析一下构造函数和析构函数:

最前面 3 个无参构造函数是 new Employee[3] 动态分配内存时调用的;

在声明 vector : vector emVec 这个时候还没有分配内存,此时,如果调用 size() 和 capacity() 可以看到 vector 的这两个值都为 0 ;

接下来的三个无参构造函数是声明三个 Employee 调用的,好理解;

使用 pushback() 将第一个 Employee 加入 vector ,可以看到此时调用了拷贝构造函数,原因是调用 pushback() 时会给 vecotr 分配一个内存空间,再将 em1 拷贝到这个内存;

第二次调用 pushback() ,可以看到这时有调用了一次拷贝构造函数,一次析构函数再加一次拷贝构造函数,这时为什么呢?

来看一下 vector 的内存分配机制:我们知道 vector 可以使用下标来访问相应元素,那就说明 vector 容器中的元素是连续存放的。为了满足这一特性,在每次调用 pushback 都需要重新分配内存,把 vector 中已有的元素拷贝到新的内存中,将旧内存释放掉,再把本次 pushback 的元素拷贝到新内存里。

所以分析可知,在第二次调用 pushback 时,是为 vector 重新分配了两个内存空间,首先将 Employee1 拷贝到新内存,就有了一次拷贝构造函数;再将旧内存释放掉,有了一次析构函数;最后将 Employee2 拷贝到新的内存,又调用了一次拷贝构造函数。

第三次调用 pushback() 时调用了两次拷贝构造函数,两次析构函数,一次拷贝构造函数,这就不难理解了。 程序执行结束后有 9 个析构函数,分别是析构之前 new 产生的 3 个 Employee 和定义的 3 个 em1 , em2 , em3 ,以及 vector 中的 3 个。注意,通过 new 分配的内存一定要使用 delete 释放掉!

0 0
原创粉丝点击