std::vector::operator[]返回的引用可以使用多长时间?



std::vector::operator[] "返回对vector容器中位置n的元素的引用。"

我可以永远使用这个引用吗?我可以把它传递给另一个线程,并从另一个线程使用吗?是否有可能,引用是无效的(原因矢量调整大小,例如),我有"垃圾",而不是真正的元素在某些点?

几乎对vector的任何突变都可能导致对元素的引用失效。如果不改变vector,则引用仍然有效。

如果你把vector看作是一个数组,那么这是有意义的,因为任何擦除(你必须移动元素)都可能意味着你不再指向正确的元素,如果你必须重新分配内存,那么元素也将不再位于相同的位置。

根据operator[]的文档:

同时访问或修改不同的元素是安全的

如果容器缩小,所有被删除元素的引用都无效(根据这一点)。这同样适用于任何删除元素的突变。

STL中对容器的数据竞争有很好的记录(对于c++ 11, c++ 03及之前没有多线程的概念)。

可以将整个向量作为引用传递给另一个线程吗?这取决于.

可以将对一个元素的特定引用传递给另一个元素阅读
1)在其他线程试图获取该元素之前,vector不被析构
2)在你传递引用后没有调整向量的大小。那么元素的实际指针可能会完全改变。

编辑:我强烈建议将向量作为整体与一些std::mutex作为同步锁并从那里继续。尝试在第一时间阻止引用无效,而不是避开它。

最新更新