
C++学艺不精看不懂这个错,请各位大佬帮忙看一下这里为什么会报一个Use After Free啊。
Result<pcrepp, pcrepp::compile_error> pcrepp::from_str(std::string pattern, int options) { const car *errptr; int eoff; auto code = pcre_compile(pattern.c_str(), options | PCRE_UTF8, &errptr, &eoff, nullptr); if (!code) { return Err(compile_error{errptr, eoff}); } return Ok(pcrepp(std::move(pattern), code));//这一行报错 } //报错信息 //call to `Result` eventually accesses memory that was invalidated by call to `free()` on line 86 indirectly during the call to `Ok`. //84. } //85. //86. return Ok(pcrepp(std::move(pattern), code)); // ^ //87. } //88. Ok方法
template<typename T, typename CleanT = typename std::decay<T>::type> types::Ok<CleanT> Ok(T&& val) { return types::Ok<CleanT>(std::forward<T>(val)); } Result的构造函数
Result(types::Ok<T> ok) : ok_(true) { storage_.construct(std::move(ok)); } 谢谢各位大佬了[抱拳]
storage_.construct 的部分
void construct(types::Ok<T> ok) { new (&storage_) T(std::move(ok.val)); initialized_ = true; } 1 Inn0Vat10n 2021-04-30 01:22:07 +08:00 Ok 的这一层转换,拿 左值引用 引用 右值了 |
2 yazoox 2021-04-30 10:24:47 +08:00 楼主,请教一下。 template<typename T, typename CleanT = typename std::decay<T>::type> 你这里,定义模板,最后这个 std::decay<T>::type 为什么要添加?我看你下面函数体,也没有用到呢...... |
3 wutiantong 2021-04-30 11:33:05 +08:00 可能错在 storage_.construct 这里面 |
4 araraloren 2021-04-30 15:25:28 +08:00 我还以为我在看 rust 。。 |
5 wutiantong 2021-05-06 17:24:39 +08:00 |