C ++:自动向量重新分配调用复制构造函数?为什么?

时间:2012-06-23 01:00:41

标签: c++ stdvector

我正在阅读C ++ Primer,3rd Ed(Lippman和Lajoie),它说当需要重新分配向量以便为添加push_back()的更多元素腾出空间时,元素在新空间中复制构造,然后在旧元素上调用析构函数。我很困惑为什么这是必要的 - 为什么数据只能逐位复制?我假设答案与动态内存分配有关,但我目前的推理方法是,即使向量元素处理动态内存,实际存储在元素中的数据也将是指针,这意味着按位复制将保留它们指向的位置并且不会出现任何问题。我可以看到如何重新定位元素指向的动态分配的内存将是一个问题,因为它会使指针无效,但据我所知,向量重新定位没有理由这样做。

有人能给我一个不应该逐位移动的类的简单例子吗?

2 个答案:

答案 0 :(得分:7)

这可能是最简单的(但更人为的)例子:

class foo
{
  int i;
  int* pi; // always points to i
};

此处,复制构造函数将保持pi指向i的不变量。编译器本身无法自己弄清楚这种关系,因此需要调用复制构造函数。

答案 1 :(得分:4)

  

有人能给我一个不应该逐位移动的类的简单示例吗?

按照标准,在{em>任何类a POD in C++03 (or trivially copyable in C++11)上执行memcpy都符合条件。 memcpy非POD(或非平凡的可复制)调用未定义的行为;因此必须使用实际的副本(或在C ++ 11中,移动)构造函数

所以std::vector 本身适用,因为它不是POD类型(在C ++ 11中,它不是简单的可复制的)。