C++ STL向量插入-复制构造函数

C++ STL向量插入-复制构造函数,c++,stl,C++,Stl,为什么在v.insert(ii,*(新的B());,两个拷贝构造函数被称为???首先,由于没有删除从new中分配的内存,因此内存泄漏。正确的方法是v.push_back(B(100)) 关于为什么复制向量被调用两次,看起来在第二次插入时,向量已经达到其容量,并且正在重新分配。在重新分配期间,它将先前插入的元素复制到新分配的内存中。因此,您会看到复制ctor被调用两次。首先,由于您没有删除从new分配的内存,因此内存泄漏。正确的方法是v.push_back(B(100)) 关于为什么复制向量被调用

为什么在v.insert(ii,*(新的B());,两个拷贝构造函数被称为???

首先,由于没有删除从
new
中分配的内存,因此内存泄漏。正确的方法是
v.push_back(B(100))


关于为什么复制向量被调用两次,看起来在第二次插入时,向量已经达到其容量,并且正在重新分配。在重新分配期间,它将先前插入的元素复制到新分配的内存中。因此,您会看到复制ctor被调用两次。

首先,由于您没有删除从
new
分配的内存,因此内存泄漏。正确的方法是
v.push_back(B(100))


关于为什么复制向量被调用两次,看起来在第二次插入时,向量已经达到其容量,并且正在重新分配。在重新分配期间,它将先前插入的元素复制到新分配的内存中。因此,您会看到复制构造函数被调用了两次。

一个更糟糕的问题是
*(new B())
是内存泄漏-您复制一个动态分配的对象,然后扔掉指向它的唯一指针。应改为创建临时对象:

   Default constructor 
   copy constructor
   #####################
   Default constructor 
   1. copy constructor
   2. copy constructor
   destructor 
   #####################
   destructor 
   destructor 

为了回答这个问题:因为向量是作为连续的内存块存储的,所以有时需要随着它们的增长而增加容量。发生这种情况时,必须将阵列中的所有对象复制(或移动)到其新位置。在这里,您可以看到一个拷贝来移动现有元素,另一个拷贝来插入新元素。

一个更糟糕的问题是
*(new B())
是内存泄漏-您复制一个动态分配的对象,然后扔掉指向它的唯一指针。应改为创建临时对象:

   Default constructor 
   copy constructor
   #####################
   Default constructor 
   1. copy constructor
   2. copy constructor
   destructor 
   #####################
   destructor 
   destructor 
为了回答这个问题:因为向量是作为连续的内存块存储的,所以有时需要随着它们的增长而增加容量。发生这种情况时,必须将阵列中的所有对象复制(或移动)到其新位置。因此,这里您可以看到一个副本来移动现有元素,另一个副本用来插入新元素。

C++不是Java。你不应该写这样的东西:
push_back(*(新的B(i*100))
。它在堆上创建一个B的实例,然后将其忘掉。你做的事情基本上是在泄漏内存。你可以使用<代码> PurthBeBuffe(b(i*100))< /> >或者在你的例子中<代码> Puxjava(i 100) >因为你的代码> B< /Cuff>类可以被隐含地构造。C++不是Java。你不应该写这样的东西:
push_back(*(新的B(i*100))
。它在堆上创建一个B的实例,然后将其忘掉。你做的事情基本上是在泄漏内存。您可以使用
push_-back(B(i*100))
或者在您的例子中使用
push_-back(i*100)
,因为您的
B
类可以隐式构造。
v.insert(ii+1, B());