C++ 向量拷贝,会发生什么?

C++ 向量拷贝,会发生什么?,c++,vector,std,C++,Vector,Std,我想问一下社区关于std::vector的问题,它来自C std::vector<int> temp1(4,0); temp1[0] = 10; std::vector<int> temp2; temp2 = temp1; temp1[0] = 0; for (int i=0;i<4;i++) std::cout<<"temp1: " <<temp1[i]<<"temp2: "<<temp2[i]<<

我想问一下社区关于std::vector的问题,它来自C

std::vector<int> temp1(4,0);
temp1[0] = 10;
std::vector<int> temp2;
temp2 = temp1;
temp1[0] = 0;
for (int i=0;i<4;i++)
    std::cout<<"temp1: " <<temp1[i]<<"temp2: "<<temp2[i]<< std::endl;
std::向量temp1(4,0);
temp1[0]=10;
std::向量temp2;
temp2=temp1;
temp1[0]=0;

对于(int i=0;i,因为这些对象的类型是
std::vector
,是的,它是一个深度副本,但不是,在执行
temp1=temp2
时,不会调用析构函数

如果类型为
std::vector
,其中
X
是一个类,则
temp1=temp2
仍然是一个深度拷贝,并且 (取决于两个向量的进一步细节,可能还有 std::vector的实现 它可能会毁掉整个世界
temp1
的旧内容——即包含
X
类型的任何对象 在分配之前的
temp1
中,可能会调用它们的析构函数。
(对
std::vector::operator=
的调用无法调用任何析构函数 因为
int
没有析构函数。)

如果类型是
std::vector
(现在
X
可以是一个类或
int
或其他一些原语,甚至是指针类型),
temp1=temp2
不会执行深度拷贝——至少我不会(通常)称之为深度复制,因为只有指针被复制,并且它们指向与仍在
temp2
中的指针相同的对象。 (我说“通常”,是因为有些情况下 可以说指针本身就是数据结构的内容 因此副本是“深的”。) 在这种情况下不调用析构函数,即使
X
是一个类,
因为
*X
没有析构函数。

析构函数只有在对象的生命周期结束时才被调用,例如,当带有自动存储的局部变量超出范围时。你知道你可以很容易地找到它:
std::vector::operator=
进行深度复制。这是
std::vector
如此广泛的主要原因之一非常有用。如果您真的想知道在处理向量时发生了什么,请定义一个具有日志记录的简单类(std::cout或其他)在每个构造函数、析构函数、复制构造函数等中,将这些对象放在向量中。没有研究的努力。这些细节是基本的,可以在Web上或在C++的书中找到,很小。如果类型是STD::vector,其中x是一个类,那么Time1= Tim2仍然是一个深拷贝,但是它将调用类X复制构造函数。对于包含在temp1容器中的X的每个对象,我认为不会调用类X的析构函数,除非调用temp1容器clear或将其退出scope@RamGood point.Cplusplus.com说,“在调用之前容器中保存的任何元素都会被分配或销毁。”C++11允许使用不同的分配器替换分配器,在这种情况下,所有内容都会被销毁,但在其他情况下,似乎不需要销毁内容。另一个问题是,如果temp2.size()远小于temp1.size(),会发生什么;std::vector是否可以重新分配到更小的大小以释放内存?
std::vector<int> temp1(4,0);
std::vector<int> temp2(4,1);
for (int i=0;i<4;i++) {
    // some temp2 values filled
    temp1 = temp2;
}
return 0;