std::vector::operator[]返回的引用可以使用多长时间?
how long can I use reference returned by std::vector::operator[]?
std::vector::operator[]
"返回对vector容器中位置n的元素的引用。"
我可以永远使用这个引用吗?我可以把它传递给另一个线程,并从另一个线程使用吗?是否有可能,引用是无效的(原因矢量调整大小,例如),我有"垃圾",而不是真正的元素在某些点?
几乎对vector的任何突变都可能导致对元素的引用失效。如果不改变vector,则引用仍然有效。
如果你把vector看作是一个数组,那么这是有意义的,因为任何擦除(你必须移动元素)都可能意味着你不再指向正确的元素,如果你必须重新分配内存,那么元素也将不再位于相同的位置。
根据operator[]
的文档:
同时访问或修改不同的元素是安全的
如果容器缩小,所有被删除元素的引用都无效(根据这一点)。这同样适用于任何删除元素的突变。
STL中对容器的数据竞争有很好的记录(对于c++ 11, c++ 03及之前没有多线程的概念)。
可以将整个向量作为引用传递给另一个线程吗?这取决于.
可以将对一个元素的特定引用传递给另一个元素阅读
1)在其他线程试图获取该元素之前,vector不被析构
2)在你传递引用后没有调整向量的大小。那么元素的实际指针可能会完全改变。
编辑:我强烈建议将向量作为整体与一些std::mutex
作为同步锁并从那里继续。尝试在第一时间阻止引用无效,而不是避开它。
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- SFML RenderWindow打开窗口需要很长时间
- Kafka C++客户端需要很长时间才能收到消息
- 给定使用 C++ 或 C,我如何测量在 linux 下进行线程切换需要多长时间?可能吗?
- asio::read() 需要很长时间,使用 asio::write 没有问题
- 将线程锁定很长时间
- 是否可以使C++类成为Objc类的委托
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 是否可以使一个类成为两个不同层次结构的子类?
- 即使长时间等待,C++线程也不会加入
- 连接() 在连接被拒绝时长时间挂起
- 为什么这段代码需要这么长时间才能用 g++ 编译?
- 如何在长时间运行的方法中等待信号?
- mbed 套接字连接需要很长时间
- Lambda 捕获此函数和长时间运行的函数
- 一个循环,可以打印所有项目(无论链条多长时间) *指针
- 是否可以在谷歌测试运行中将测试标记为需要很长时间
- 如果程序需要很长时间才能完成,如何使程序停止?
- 为什么具有多个嵌套循环的代码可以在 GCC 上立即完成,但在 VS 上需要很长时间
- std::vector::operator[]返回的引用可以使用多长时间?