【发布时间】:2015-10-28 17:41:31
【问题描述】:
我在向std::vector 添加新元素时偶然发现了一个问题。
似乎当您尝试向其添加更多元素时,它需要分配更多空间,它通过复制当前拥有的 last element all elements 来做到这一点。这似乎假设向量中的任何元素都是完全有效的,因此复制总是会成功。
在我们的例子中,这不一定是真的。目前我们可能在向量中有一些剩余的元素,因为我们选择不删除它们,它们是有效的对象,但它们的数据并不能保证有效的行为。对象有保护,但我从未考虑向复制构造函数添加保护,因为我认为我们永远不会复制无效对象(向量强制):
CopiedClass::CopiedClass(const CopiedClass& other)
: member(other.member)
{
member->DoSomething();
}
碰巧当我们处理完原始对象并将其留在向量中时“成员”为空,因此当 std::vector 尝试复制它时,它会崩溃。
是否可以防止std::vector 复制该元素?还是我们必须防止可能的无效对象被复制?理想情况下,我们希望继续假设只创建了有效对象,但这似乎意味着我们会立即从向量中清除它们,而不是等待并在稍后的某个阶段进行。
【问题讨论】:
-
那么您有一个对象在其生命周期内可能变得不可复制?
-
std::vector总是在push_back()上复制,不,你不能阻止这种行为。 -
@πάνταῥεῖ 我不认为这部分是问题所在。我认为问题在于向量经过重新分配时的副本。
-
在受影响的复制构造函数中通过
vector_member(filter_garbage(other.vector_member))初始化向量(并在赋值运算符中执行类似操作(可能是复制/交换)) -
“似乎当您尝试向其添加更多元素时,它需要分配更多空间,它通过复制它当前持有的最后一个元素来做到这一点”。这样的行为将违背标准和常识。你能演示一下吗?