VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 616|回复: 1

[求助] 一次构造 七次析构 不至于吧

[复制链接]
41_avatar_middle
在线会员 发表于 2015-10-2 09:02:30 | 显示全部楼层 |阅读模式
3驿站币
#include<iostream>
#include<memory>
#include<vector>
using namespace std;
class A
{
public:
        A()
        {
                cout<<"A"<<endl;
        }
        ~A()
        {
                cout<<"~A"<<endl;
        }
};
int main()
{
        {
        std::shared_ptr<vector<A>> p(new vector<A>);
        A a;
        p ->push_back(a);
        p ->push_back(a);
        p ->push_back(a);
        }
        return 0;
}





上一篇:有没高手会反汇编的
下一篇:GitHub Desktop的自动更新用VC怎么实现
74_avatar_middle
在线会员 发表于 2015-10-2 15:11:14 | 显示全部楼层
有7次析構是 當然的事 因為你一共創建了7個 A的實例
只不過其中6個 是通過 拷貝構造自動創建的 你加上 如下代碼 就會發現了

  1. A(const A& a)
  2.                 {
  3.                         cout<<"A(const A& a)"<<endl;
  4.                 }
复制代码



要明白這個 你想要知道 vector的 工作原理
vector 使用是一個 自動增長點數組 有 容量capacity 大小size 兩個 概念(std標準容器都有這兩個 概念)
vector 自動申請 一塊連續內存(大小為 sizeof(T) * capacity) 當 capacity == size 後 再執行 push 操作 vector 會 重新申請內存
++capacity
malloc(sizeof(T) * capacity)
之後 將 原來的 元素 使用 copy方式 拷貝 到 新的 地址


下面分析你的代碼
  1. std::shared_ptr<vector<A>> p(new vector<A>);
复制代码
此句 使用 智能指針 保存 1個 capacity 為0 的 vector


  1. A a;
复制代码
創建了第1個 A的 實例


  1. p ->push_back(a);
复制代码
為vector push 元素 此時 capacity 為0 vector自動 申請 sizeof(T) 的內存 capacity 變為1 並將 a 通過 拷貝構造 存儲其副本 是為第2個A的實例



  1. p ->push_back(a);
复制代码
第2次執行 push 此時 sizeof ==capacity 且 capacity = 1 故 vector 重新申請sizeof(T)*2的 新內存 並且將 原來元素 複製過來
將 第2個A的實例 拷貝 構造 存儲 是為 第三個 A的實例 將 push的a 存儲副本 是為第4個 A的實例
同時 vector釋放 之前的 capacity=1 時的 內存 第2個A的實例 生命結束 析構被調用



  1. p ->push_back(a);
复制代码

第3次執行 push 類似 第2次 不過 此時 舊地址中有2個 元素 故 要 重新 構造 2個新實例 既 第5 6個實例 同時 保存 a的 副本 第7個實例
且之後釋放 舊地址的 兩個 元素 第3 4 個 實例釋放 其析構被調用

  1. }
  2.         return 0;
复制代码
}
之後 a生命結束 調用其析構 p 生命結束 釋放 vector vector釋放時 其內部 保存的 3個 實例 被釋放 次3個大析構被調用

评分

参与人数 2驿站币 +6 热心值 +6 收起 理由
51_avatar_small Syc + 3 + 3 赞一个!
78_avatar_small jpacg + 3 + 3 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-20 02:13

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表