Sau*_*ahu 5 c++ destructor vector copy-constructor
class base
{
private:
int k;
public:
base(const base& b){ this->k = b.k; cout<<" c-ctor "<<endl; }
base(int a = 10){ k = a; }
~base(){cout << "destructor called\n";}
};
int main()
{
base b, b1(2);
vector<base> m;
cout << "first pushback" <<endl;
m.push_back(b);
cout << "2nd pushback" <<endl;
m.push_back(b1);
cout << "3rd pushback" <<endl;
m.push_back(b1);
cout << "4th pushback" <<endl;
m.push_back(b);
cout << "5th pushback" <<endl;
m.push_back(b);
cout<<" =============================================== "<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
first pushback
c-ctor
2nd pushback
c-ctor
c-ctor
destructor called
3rd pushback
c-ctor
c-ctor
c-ctor
destructor called
destructor called
4th pushback
c-ctor
5th pushback
c-ctor
c-ctor
c-ctor
c-ctor
c-ctor
destructor called
destructor called
destructor called
destructor called
===============================================
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
Run Code Online (Sandbox Code Playgroud)
为什么我TH push_back导致我一些拷贝构造函数调用?
这不是一个调整大小的效果(即再次复制原始向量)和将元素插入向量的低效方式吗?
为什么4 个 push_back由具有比不同的行为2 个,3 个 ABD 5 次 push_back?
没有大碍.每次size到达它时,都会重新分配向量capacity.所有元素都从旧向量复制到新向量.
通常,为新矢量分配原始容量的两倍.
push_back,容量为1.因此不需要重新分配.push_back,容量需要加倍,因此对复制构造函数进行两次调用,首先将旧元素复制到新向量,然后复制第二个push_back.容量现在是2.push_back再次需要重新分配向量,因为容量现在是2.重新分配后容量变为4.push_back)的调用.容量仍然是4.push_back,重新分配发生,4个旧元素和一个新元素(push_back)被复制到新向量.容量现在是8.如果你继续前进,你会发现重新分配将在9日发生push_back.
此外,在重新分配时需要调用析构函数,此时不再需要旧的向量,因此应该销毁其中的成员.
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |