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 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
|