我可以调整移动的向量的大小吗?

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);
}

如你所见,我从它移动后重新使用了秘密向量。我在看

Reusing a moved container?

但我不能完全清楚这一点(我不明白“前提条件”究竟是什么)。

我的问题是:我可以调整一个移动的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是为数不多的有意义的函数之一,因为它“重新指定”了向量的状态。

以上是关于我可以调整移动的向量的大小吗?的主要内容,如果未能解决你的问题,请参考以下文章

查找向量的大小

出现键盘后调整活动大小

如果向量成员改变大小,类成员偏移量可以改变吗?

如何重新调整多维向量的大小? C++ [重复]

调整指针段错误向量的大小

调整片段中 TextView 的文本大小