2012-04-12 25 views
3

任何人都可以解釋爲什麼以下崩潰與訪問衝突0xFFFFFFFFavformat_open_input右值的c_str() - 不安全?

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; 
} 
+0

向我們顯示avformat_open_input的定義。 – Tomek 2012-04-12 15:55:56

+1

@Tomek:http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavformat/utils.c;h=2f926bb4e0784b031456fce7b477a7eebac8b440;hb=refs/heads/master#l583 – ronag 2012-04-12 15:59:37

+0

這是什麼u8'的實現看起來像什麼? – 2012-04-12 16:06:04

回答

1

u8(filename).c_str()結果應該是可用的,直到avformat_open_input回報。它可能會保存你給它的指針,然後在avformat_find_stream_info期間使用它。

爲這些avformat函數或其實現發佈文檔,以便我們可以看到它是否真的在做這些。


它看起來並不像avformat_open_input是做錯什麼。現在我懷疑在程序的早些時候發生了未定義的行爲。嘗試使用類似valgrind或靜態分析的工具,看看是否有任何東西出現。

+0

bames53:查看問題中的第二條評論。 – ronag 2012-04-12 16:00:17

+2

如果是這樣,那麼AV不會出現在'avformat_open_input',而是在調用'avformat_find_stream_info' – 2012-04-12 16:02:52

+0

@DavidHeffernan是的,你是對的。而代碼似乎無論如何複製字符串。 – bames53 2012-04-12 16:07:34