我正在阅读C++ Primer,3rd Ed(Lippman和Lajoie),它的意思是,当需要重新分配 vector 以腾出空间添加更多push_back()
元素时,这些元素将在新空间中复制构造,然后在旧元素上调用析构函数。我对为什么这是必要的感到困惑-为什么不能仅逐位复制数据?我认为答案与动态内存分配有关,但是我目前的推理是,即使 vector 元素处理动态内存,实际存储在元素中的数据也将是指针,这意味着按位复制将保留它们指向的位置不会出现任何问题。我可以看到如何重新定位元素所指向的动态分配的内存将是一个问题,因为它将使指针无效,但据我所知, vector 重新定位将没有理由这样做。
有人可以给我一个不应该逐位移动的类的简单示例吗?
最佳答案
这可能是最简单(但人为设计)的示例:
class foo
{
int i;
int* pi; // always points to i
};
在这里,复制构造函数将维护
pi
指向i
的不变式。编译器本身无法自行确定这种关系,因此需要调用复制构造函数。关于C++:自动 vector 重新分配调用拷贝构造函数?为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11165924/