【发布时间】:2013-09-18 06:53:06
【问题描述】:
vector<int> v;
v.push_back(1);
v.push_back(v[0]);
如果第二个 push_back 导致重新分配,则对向量中第一个整数的引用将不再有效。所以这不安全?
vector<int> v;
v.push_back(1);
v.reserve(v.size() + 1);
v.push_back(v[0]);
这样就安全了?
【问题讨论】:
-
注意:标准提案论坛目前正在讨论。作为其中的一部分,有人给了example implementation of
push_back。另一个海报noted a bug in it,它没有正确处理你描述的情况。据我所知,没有其他人认为这不是错误。并不是说这是确凿的证据,只是一种观察。 -
很抱歉,我不知道该接受哪个答案,因为正确答案仍有争议。
-
我被要求在下面的第 5 条评论中评论这个问题:stackoverflow.com/a/18647445/576911。我这样做是通过支持当前说的每个答案来做到这一点的:是的,push_back 来自同一向量的元素是安全的。
-
@BenVoigt:
如果您不同意标准所说的,或者即使您同意标准,但认为它说得不够清楚,这始终是您的选择: cplusplus.github.io/LWG/lwg-active.html#submit_issue 我自己选择这个选项的次数比我记得的要多。有时成功,有时不成功。如果您想讨论标准的内容或应该说的内容,那么 SO 不是一个有效的论坛。我们的谈话没有规范意义。但是您可以通过点击上面的链接来获得规范性影响。 -
@Polaris878 如果 push_back 导致向量达到其容量,向量将分配一个新的更大的缓冲区,复制旧数据,然后删除旧缓冲区。然后它将插入新元素。问题是,新元素是对旧缓冲区中刚刚被删除的数据的引用。除非 push_back 在删除之前复制该值,否则它将是一个错误的引用。
标签: c++ vector reference language-lawyer push-back