我可以调整移动的向量的大小吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以调整移动的向量的大小吗?相关的知识,希望对你有一定的参考价值。
我有一些代码,我想要确保移动的std::vector
不会留下秘密数据(想想加密密钥管理)。在我的班级移动构造函数中,我做了类似的事情:
X(X&& rhs): secret_vector{std::move(rhs.secret_vector)}{
rhs.secret_vector.resize(N);
safe_zero(rhs.secret_vector); // zero out all elements
rhs.secret_vector.resize(0);
}
如你所见,我从它移动后重新使用了秘密向量。我在看
但我不能完全清楚这一点(我不明白“前提条件”究竟是什么)。
我的问题是:我可以调整一个移动的std :: vector,对它执行一些操作,然后将其调整为零吗?
我的问题是:我可以调整一个移动的std :: vector,对它执行一些操作,然后将其调整为零吗?
从对象移动应该是未指定但有效的状态。
所以你有权调整它(不需要先决条件)。 safe_zero它,并清除它。
(我不明白“前提条件”究竟是什么)。
对象应该不具有调用UB的状态条件。
例如,operator[](std::size_t i)
需要i < size()
。
resize()
,clear()
没有要求。
[defns.valid]未指定的对象的有效但未指定的状态值,除了满足对象的不变量,并且对象上的操作的行为与其类型的指定相同
[示例:如果std :: vector类型的对象x处于有效但未指定的状态,则可以无条件地调用x.empty(),并且仅当x.empty()返回false时才能调用x.front()。 - 结束例子]
std::vector::resize
没有任何先决条件。无论向量处于什么有效状态,调整大小都不会有未定义的行为(忽略由包含元素的构造函数引起的UB;但是当参数为0时不会调用它们)。
是。该对象处于有效但处于未指定状态,如链接问题中所述。这意味着你不能假设任何关于std::vector
的内容。调用size
是安全的,但它可能不会返回与移动前相同的值。向量的状态是有效的,这意味着内部没有悬空指针或任何东西,包括resize
在内的所有成员函数都可以正常工作。此外,调用resize是为数不多的有意义的函数之一,因为它“重新指定”了向量的状态。
以上是关于我可以调整移动的向量的大小吗?的主要内容,如果未能解决你的问题,请参考以下文章