
C++学艺不精看不懂这个错,请各位大佬帮忙看一下这里为什么会报一个Use After Free啊。
Result<pcrepp, pcrepp::compile_error> pcrepp::from_str(std::string pattern, int options) { const char *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 Apr 30, 2021 Ok 的这一层转换,拿 左值引用 引用 右值了 |
2 yazoox Apr 30, 2021 楼主,请教一下。 template<typename T, typename CleanT = typename std::decay<T>::typ> 你这里,定义模板,最后这个 std::decay<T>::type 为什么要添加?我看你下面函数体,也没有用到呢...... |
3 wutiantong Apr 30, 2021 可能错在 storage_.construct 这里面 |
4 araraloren Apr 30, 2021 我还以为我在看 rust 。。 |
5 wutiantong May 6, 2021 |