给一些使用C++先进技术的卡RE的人的小提醒
查看原帖
给一些使用C++先进技术的卡RE的人的小提醒
1127157
LanQiao1234楼主2024/5/19 09:05

(所以C++11算先进吗)
起因就是我在经过一些示例测试之后不加脑筋地提交了代码,结果一些数据卡了RE(实际上才70),然后经过我的调试,发现了出错的代码:

auto find_first=str.begin();
/*省略*/{
	/*...*/
	str.replace(find_first,find_first+1,changeTo_string);
}

可能有聪明人说:“啊,这不就是字符串替换吗,有什么好出错的”
是,我就是被自己的聪明骗了

在第二次调试时,我检测了find_first和str.begin()的差,结果...嗯,状态不怎么乐观

find_first.base()-str.begin().base()==-8078207

看起来,好像是find_first迭代器被抛弃了?我也不知道,于是在一番搜索后,找到了这个

里面没有明确写出std::string调用replace后的结果,但是贴出了一个C++ 泼赖妈Primer的一张图片,正好是问题所在 C++primer中文版 第五版 9.3.6 P315

没错,str在replace后因为扩容,重新分配了内存,所以迭代器失效

了解了这么多,这个代码应该怎么改?

其实也很简单,首先存储迭代器指向元素的索引,然后在replace后获取到新string内存的begin()迭代器即可

//存储原字符串中被替换的位置,因为string可能会在replace时改变地址
size_t tmp_dis=find_first-str.begin();
find_first=str.replace(find_first,find_first+>1,changeTo_string).begin()+tmp_dis;

看似大费周章,其实对于内存不安全的C++,这很有必要

2024/5/19 09:05
加载中...