C++ vector在多线程操作中出现内存错误解决方案

本文详细介绍了C++ vector的reserve和resize方法,并通过一个例子展示了在多线程环境中,直接操作vector可能导致内存错误的问题。在A线程中push_back更新全局vector,在B线程中通过引用访问vector元素时,由于vector动态增长导致引用失效,引发程序崩溃。为解决此问题,文章提出了在构造函数中使用reserve预先分配足够内存,避免动态增长带来的问题,以提高效率并防止内存错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ vector的reserve和resize详解

reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。

resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。

vector在多线程中操作举例:

有一个全局变量 vector goods_list;

在A线程中从服务器获取最新商品列表,goods_list.push_back()

在B线程中不断的下载商品图片,
Goods &goods = goods_list.at(i)
读取goods .pic_url,下载完成后赋值 goods.local_pic = local_pic

以上简单的逻辑,缺导致程序崩溃,提示内存写入错误。

调试定位到goods.local_pic = local_pic这一句。

估计就是多线程的问题。

查了一下资料,原来vector每次push_back都会重新分配内存,导致goods 这个引用无效,所以goods.local_pic = local_pic赋值写入的时候就会写入到一个无效的地址,导致程序崩溃。

解决办法:

加锁也可以解决这个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值