讨论/技术交流/老哥们看以下这段代码(就20行)/
老哥们看以下这段代码(就20行)

编译器版本:gcc version 8.1.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)

#include<iostream>
#include<vector>
#include<utility>
using namespace std;

class A
{
private:
    int val;
public:
    A()
    {
        cout << "默认构造\n";
    }

    A(const A &a): val(a.val)
    {
        cout << "拷贝构造\n";
    }

    A& operator=(const A &a)
    {
        cout << "拷贝赋值\n";
        val = a.val;
        return *this;
    }
    
   
    ~A()
    {
        cout << "析构\n";
    }
};

int main()
{
    //我认为输出应该是
    /*
    默认构造
    拷贝构造
    析构
    默认构造
    拷贝构造
    析构
    默认构造
    拷贝构造
    析构
    析构
    析构
    析构
    */
    vector<A> va;
    va.push_back(A());
    va.push_back(A());
    va.push_back(A());
    //为什么输出是这个样子的?
    /*
    默认构造
    拷贝构造
    析构
    默认构造
    拷贝构造
    拷贝构造//为什么两个拷贝构造??
    析构
    析构
    默认构造
    拷贝构造
    拷贝构造
    拷贝构造//为什么三个拷贝构造?
    析构
    析构
    析构
    析构
    析构
    析构
    */

}
共 3 个回复

这和 vectorvector 的内存分配有关,作为变长数组, vectorvector 的长度是动态变化的,元素数量超过容量时,会进行类似于 CC 语言的 reallocrealloc 操作。你试试运行如下代码:

    vector<A> va;
    va.reserve(3);
    va.push_back(A());
    va.push_back(A());
    va.push_back(A());
2

对,会调用构造函数。我说 reallocrealloc 的意思是,内存不够的时候会进行重分配和迁移,迁移路上发生的事情和 CC 语言就不一样了

谢谢老哥,我试了你的代码。我大概可以猜出来,vector的扩容是采用new来分配的吧?c语言的内存分配不会初始化,使用new会调用构造函数。