我想向社区询问有关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;
temp1:0 temp2:10
temp1:0 temp2:0
temp1:0 temp2:0
temp1:0 temp2:0
在temp2 = temp1,temp2似乎是一个深拷贝,这是正确的吗?另外,在这种情况下会发生什么?
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;
当temp1更新时,实际发生了什么。是否复制了以前的temp1的析构函数?
答案 0 :(得分:1)
因为这些对象的类型为std::vector<int>
,是的,它是一个深层副本,但不是,当你执行temp1 = temp2
时,不会调用析构函数。
如果类型为std::vector<X>
,其中X
是一个类,那么
temp1 = temp2
仍然是一个很深的副本
(取决于两个载体的进一步细节,可能还有
std :: vector的实现)
它可能破坏了
temp1
的旧内容 - 也就是说,包含X
类型的任何对象
在分配之前temp1
,他们的毁灭者可能会被召唤。
(对std::vector<int>::operator=
的调用无法调用任何析构函数
因为int
没有析构函数。)
如果类型为std::vector<*X>
(现在X
可以是类或int
或其他一些原语,甚至是指针类型),temp1 = temp2
将无法执行深度复制 - 至少,我不会(通常)将其称为深拷贝,因为只复制指针并且它们指向与仍在temp2
中的指针相同的对象。
(我说“通常”,因为有些情况下有人
可以争辩说,指针本身是数据结构的内容
因此副本是“深度”。)
在这种情况下,即使X
是一个类,也不会调用析构函数,
因为*X
没有析构函数。