zoukankan      html  css  js  c++  java
  • 记一次源码分析

    首先分析一段很短的代码 

    #include<iostream>
    #include<vector>
    using namespace std;
    
    vector<int> getdata(){
        vector<int> v{2,3,4,5,6};
        // return std::move(v);
        return v;
    }
    
    int main()
    {
        //vector<int> temp(getdata());
       auto b=begin(getdata());
       cout<<*b;
       //以下方式输出正常
       for(auto i: getdata()){
          cout<<i;
       }
    return 0; }

    这段代码是错的,里面出现了一个很容易犯得bug/如果函数中有建立本地对象并需要返回时,只能返回对象,不能返回指针或引用,因为函数调用完后,这个对象也就会随之进行析构(释放),但是如果我们试着返回一个vector的本地对象时然后对这个本地对象直接调用begin()函数得到的却不是我们想要的,然后我就去单步调试了/去挑战

    //说明环境 我用的是mingw编译器 g++

    首先进入局部函数然后构造vector 然后分配内存,这个肯定不用多说 废话不多说 上图  这里没有什么好说的 调用的应该是第一个没有任何参数的 allocator

    然后就是 调用vector的构造函数 因为我写的形式 initiallist形式 所以选择的构造函数 也是 这种方式的。

    然后就是重点了 敲黑板 这个 构造函数里面的 范围初始化函数 我认为很重要 从这张图也可以看出 vector的主流构造内容主要就是在这了

    首先赋予了内容的长度 其实 vector的size()函数返回的就是这个n  对开头指针进行赋值,然后再对另外两个赋值 其实 vector的数据定义中都有他们的身影,也就是说自身的某些函数的返回值就是这些 数据

    当然下图只是其中的一部分

     接着来 杠tm的

    然后上面的那些 复制情况 各自调用 各自的函数 也没啥好说的 直到这一步 这有一个 不初始化的复制操作 说实话 本屌也不知道这是个啥 但是请记住这里的地址 总感觉有点不太寻常

    到这儿 整个的vector的初始化就结束了 然后调用了分配内存的析构函数 因为此vector还有用 所以 没用调用他的析构函数

    随后调用了 begin()函数 /题外话 C++11的begin()函数 分为两种 一种是 容器自带的 另一种是外部的  也就是说你也可以为自己写的类调用官方的begin()函数,但是还是需要写一个该容器的内部begin()函数 总之总用不算太大 应该说是个鸡肋吧

    然后这里就是很玄学的一个地方了 这里谁都知道就是调用了  注意看他的 begin里面调用de函数

    然后就去析构了 析构了 析构了 /啥玩意儿!

    析构完出来就是这样了

    结论: 返回出来的那个地址的确是只想vector的地址,但是vector进行析构了,也就是说在在调用完getdata()后,自身的vector就会析构 ,所以这个函数的主要bug还是要将local的生命周期 延长,

    方法一: 通过再构造一个main本地的vector,延长他的周期

    方法二:直接对其进行操作取值 比如 这样 也可以进行延期

    cout<<*begin(getdata())<<endl;
    

      

  • 相关阅读:
    vue组件间传值
    Kth MIN-MAX 反演
    BZOJ4671 异或图(容斥+线性基)
    hihoCoder #1646 : Rikka with String II(容斥原理)
    字符串小结
    LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)
    SPOJ divcntk(min25筛)
    LA3490 Generator(KMP + 高斯消元)
    ExKMP(Z Algorithm) 讲解
    BZOJ 2728: [HNOI2012]与非(位运算)
  • 原文地址:https://www.cnblogs.com/jijiboy/p/10162857.html
Copyright © 2011-2022 走看看