C++;:自动向量重新分配调用复制构造函数?为什么? 我在阅读C++入门,第三Ed(Lippman和拉乔伊),它是说,当一个向量需要重新分配,以便为更多元素添加空间,添加了 PuthObjd()/Cuth>,元素在新的空间中被复制,然后在旧元素上调用析构函数。我不明白为什么这是必要的——为什么不能一点一点地复制数据?我假设答案与动态内存分配有关,但我目前的推理是,即使向量元素处理动态内存,元素中实际存储的数据也将是指针,这意味着按位复制将保留它们指向的位置,不会出现任何问题。我可以看出如何重新定位元素指向的动态分配内存是一个问题,因为这会使指针无效,但就我所知,向量重新定位没有理由这样做

C++;:自动向量重新分配调用复制构造函数?为什么? 我在阅读C++入门,第三Ed(Lippman和拉乔伊),它是说,当一个向量需要重新分配,以便为更多元素添加空间,添加了 PuthObjd()/Cuth>,元素在新的空间中被复制,然后在旧元素上调用析构函数。我不明白为什么这是必要的——为什么不能一点一点地复制数据?我假设答案与动态内存分配有关,但我目前的推理是,即使向量元素处理动态内存,元素中实际存储的数据也将是指针,这意味着按位复制将保留它们指向的位置,不会出现任何问题。我可以看出如何重新定位元素指向的动态分配内存是一个问题,因为这会使指针无效,但就我所知,向量重新定位没有理由这样做,c++,stdvector,C++,Stdvector,有人能给我一个不应该一点一点地移动的类的简单示例吗?这里可能是最简单的(但相当做作的)示例: 这里,复制构造函数将保持pi指向i的不变量。编译器本身无法自行找出这种关系,因此需要调用复制构造函数 有人能给我一个简单的例子,说明一个类不应该一点一点地移动吗 按照标准,对任何不符合条件的类执行memcpymemcpying非pod(或非平凡的可复制)调用未定义的行为;因此,必须使用实际副本(或在C++11中,move)构造函数 因此std::vector本身也适用,因为它不是POD类型(在C++11

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

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

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

有人能给我一个简单的例子,说明一个类不应该一点一点地移动吗

按照标准,对任何不符合条件的类执行
memcpy
memcpy
ing非pod(或非平凡的可复制)调用未定义的行为;因此,必须使用实际副本(或在C++11中,move)构造函数


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

构造函数/析构函数使用父对象注册/注销类地址的场景浮现在脑海中。类型不可复制的场景浮现在脑海中。ta.spot.is有一个很好的例子,虽然我不会把每个对象注册表都称为“父对象”。另外,一些类可能会保留指向其自身数据成员的指针-例如,对某些模态状态进行建模,表示某些未来操作现在应该影响该特定成员,或者在内部向量中使用迭代器。请注意,您可以使用“指向实现的指针”习惯用法编写类,基本上将复制构造函数简化为逐位的情况,或者如果遇到实际情况,只存储智能指针。当然,很可能你的聪明的指针不会因为被复制而高兴。。。
class foo
{
  int i;
  int* pi; // always points to i
};