3

谁能解释为什么以下在 at0xFFFFFFFF处发生访问冲突而崩溃avformat_open_input

std::string u8(const std::wstring& str)
{
    return boost::locale::conv::utf_to_utf<char>(str);
}

AVFormatContext* open_input(const std::wstring& filename)
{
    AVFormatContext* context = nullptr;
    avformat_open_input(&context, u8(filename).c_str(), nullptr, nullptr);
    avformat_find_stream_info(context, nullptr);
    return context;
}

而以下工作:

AVFormatContext* open_input(const std::wstring& filename)
{
    auto u8filename = u8(filename);
    AVFormatContext* context = nullptr;
    avformat_open_input(&context, u8filename.c_str(), nullptr, nullptr);        
    avformat_find_stream_info(context, nullptr);
    return context;
}
4

1 回答 1

1

的结果u8(filename).c_str()应该可以使用,直到avformat_open_input返回。它可能会保存您给它的指针,然后在avformat_find_stream_info.

发布这些 avformat 函数或其实现的文档,以便我们查看它是否真的在这样做。


看起来并没有avformat_open_input做错什么。现在我怀疑在程序的早期某处发生了未定义的行为。尝试使用 valgrind 或静态分析之类的工具,看看是否有任何结果。

于 2012-04-12T15:58:53.340 回答