9

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

有人可以给我一个不应该一点一点移动的类的简单示例吗?

4

2 回答 2

8

这可能是最简单(但相当做作)的示例:

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

在这里,复制构造函数将维护pi指向的不变量i。编译器本身无法自行找出这种关系,因此需要调用复制构造函数。

于 2012-06-23T04:52:49.657 回答
4

有人可以给我一个不应该一点一点移动的类的简单示例吗?

按照标准,memcpy任何不是C++03 中的 POD(或在 C++11 中可简单复制)的类执行 a 都是合格的。memcpy使用非 POD(或不可复制的)调用未定义的行为;因此必须使用实际的复制(或 C++11 中的移动)构造函数。

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

于 2012-06-23T05:30:38.253 回答