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