有关" Use After Free"的问题

2021-04-30 00:07:46 +08:00
 11232as

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));
    }

谢谢各位大佬了[抱拳]

2147 次点击
所在节点    C++
5 条回复
Inn0Vat10n
2021-04-30 01:22:07 +08:00
Ok 的这一层转换,拿 左值引用 引用 右值了
yazoox
2021-04-30 10:24:47 +08:00
楼主,请教一下。
template<typename T, typename CleanT = typename std::decay<T>::type>
你这里,定义模板,最后这个 std::decay<T>::type 为什么要添加?我看你下面函数体,也没有用到呢......
wutiantong
2021-04-30 11:33:05 +08:00
可能错在 storage_.construct 这里面
araraloren
2021-04-30 15:25:28 +08:00
我还以为我在看 rust 。。
wutiantong
2021-05-06 17:24:39 +08:00
https://github.com/tstack/lnav

这么高关注度的项目,为啥不去提 issue 呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/774230

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX