向标准库对象中添加内容是拷贝一份到标准库对象中,并不调用相应的构造函数吗?甚至从一个标准库对象复制给另外一个标准库对象,也不会调用到相应的构造函数。但是在删除该标准库对象时却又调用了相应的析构函数来析构标准库对象中的内容。在向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个空间,这样不断的翻倍扩大。因此当扩大空间的时候就需要把之前小空间里的内容复制到新的空间中也就会调用到拷贝构造来拷贝到新空间,就空间里的内容也就需要调用析构来析构掉。