vector的push_back操作中关于构造函数析构函数的调用

向标准库对象中添加内容是拷贝一份到标准库对象中,并不调用相应的构造函数吗?甚至从一个标准库对象复制给另外一个标准库对象,也不会调用到相应的构造函数。但是在删除该标准库对象时却又调用了相应的析构函数来析构标准库对象中的内容。在向vector中push_back一个对象为何会析构之前的所有对象?

 1 #include <iostream>
 2 #include "windows.h"
 3 #include <atlstr.h>
 4 #include <vector>
 5 using namespace std;
 6 
 7 class TreeNode{
 8 public:
 9     TreeNode(int i){
10         this->i = i;
11         CString strTemp =TEXT("");
12         strTemp.Format(TEXT("construct %d\n"), this->i);
13         OutputDebugString(strTemp); }
14     ~TreeNode(){
15         CString strTemp =TEXT("");
16         strTemp.Format(TEXT("destruct %d\n"), this->i);
17         OutputDebugString(strTemp);}
18 private:
19     int i;
20     static int si;
21 };
22 
23 void show(vector<TreeNode> &tree)
24 {
25     vector<TreeNode> node = tree;
26 }
27 
28 void main(){
29     vector<TreeNode> vecNode;
30     TreeNode *node1 = new TreeNode(1);    // construct 1
31     vecNode.push_back(*node1);
32     TreeNode *node2= new TreeNode(2);        // construct 2
33     vecNode.push_back(*node2);                    // destruct 1
34     TreeNode *node3= new TreeNode(3);        // construct 3
35     vecNode.push_back(*node3);                    // destruct 1和destruct 2
36     show(vecNode);                        // destruct 1和destruct 2和destruct 3
37     vecNode.pop_back();        // destruct 3
38     delete node1;    // destruct 1
39     delete node2;    // destruct 3
40     delete node3;    // destruct 3
41 }    // destruct 1和destruct 2

 搜索一番这里给出了第一个问题的答案:原来会调用拷贝构造函数来拷贝。

第二个问题也得到了答案这里:vector最开始预留了1个空间的位置,当用完这1个后会自动产生2个空间,这样不断的翻倍扩大。因此当扩大空间的时候就需要把之前小空间里的内容复制到新的空间中也就会调用到拷贝构造来拷贝到新空间,就空间里的内容也就需要调用析构来析构掉。

转载于:https://www.cnblogs.com/wnarutou/archive/2013/06/12/3132711.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值