2014-07-18 86 views
0

我目前正試圖包裝一個std :: ostringstream到和std :: unique_ptr。 我目前的代碼編譯,但在運行時,我得到分段錯誤。奇怪的行爲與std :: unique_ptr和std :: ostringstream(SIGSEGV)

當我不包裝它 - 使用舊的c樣式指針,它運行良好。

有關更詳細的概述,我正在使用curlpp將數據下載到ostringstream中。

這是我在做什麼:

std::unique_ptr<std::ostringstream> data_stream; 
curlpp::Cleanup myCleanup; 
*data_stream << curlpp::options::Url(this->m_ressource_url); 

段故障發生在最後一行,這是回溯:

0x00007ffff790e2ce in std::ostream::sentry::sentry(std::ostream&)() from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/libstdc++.so.6 
(gdb) bt 
#0 0x00007ffff790e2ce in std::ostream::sentry::sentry(std::ostream&)() from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/libstdc++.so.6 
#1 0x00007ffff790e3f7 in std::ostream::write(char const*, long)() from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/libstdc++.so.6 
#2 0x0000000000429be6 in curlpp::internal::Callbacks::StreamWriteCallback (buffer=0x660d1b "Das ist (k)ein Test.", size=1, nitems=20, stream=0x0) 
    at OptionSetter.cpp:55 
#3 0x00007ffff7b90678 in ??() from /usr/lib64/libcurl.so.4 
#4 0x00007ffff7ba4d38 in ??() from /usr/lib64/libcurl.so.4 
#5 0x00007ffff7bac967 in ??() from /usr/lib64/libcurl.so.4 
#6 0x00007ffff7bad5e5 in curl_multi_perform() from /usr/lib64/libcurl.so.4 
#7 0x00007ffff7ba5dd6 in curl_easy_perform() from /usr/lib64/libcurl.so.4 
#8 0x0000000000425a78 in curlpp::internal::CurlHandle::perform (this=0x6690b0) at CurlHandle.cpp:52 
#9 0x0000000000424fca in curlpp::Easy::perform (this=0x7fffffffd5c0) at Easy.cpp:48 
#10 0x00000000004252ba in operator<< (stream=..., request=...) at Easy.cpp:116 
#11 0x0000000000424d7f in operator<< (stream=..., url=...) at Options.cpp:34 
#12 0x0000000000420bb1 in Model<std::string>::m_download (this=0x7fffffffd878) 
    at /home/bueddl/Developement/Studium/Semester 4/SWT/Source/model/src/Model.hpp:98 
#13 0x0000000000420a4e in Model<std::string>::refresh (this=0x7fffffffd878) 
    at /home/bueddl/Developement/Studium/Semester 4/SWT/Source/model/src/Model.hpp:71 
#14 0x00000000004206a5 in main() at /home/bueddl/Developement/Studium/Semester 4/SWT/Source/model/src/main.cpp:56 

僅供參考,我的文件是從#14至#12 ,上面的代碼是文件#12的一部分。現在

,這是奇怪的,當我寫休耕代碼,它的工作原理沒有問題:

std::ostringstream *data_stream = new std::ostringstream(); 
curlpp::Cleanup myCleanup; 
*data_stream << curlpp::options::Url(this->m_ressource_url); 

這兩種情況都傳遞指針操作< <,但我似乎是錯誤的。

我在哪裏錯了?

感謝您的幫助:)

注:我想用執行源庫模式的unique_ptr。

+3

呃...'data_stream'持有'NULL'指針。只是創建一個'unique_ptr '的實例本身不會創建一個'T'的實例來保存它。 –

回答

3

unique_ptr不會自動創建指向對象的實例。你仍然需要自己做。所以你的代碼試圖使用指向流的NULL指針。

你需要做的是這樣的:

std::unique_ptr<std::ostringstream> data_stream(new std::ostringstream); 
curlpp::Cleanup myCleanup; 
*data_stream << curlpp::options::Url(this->m_ressource_url); 
+0

你是對的...不能看到我怎麼可能錯過;-) –

+0

在C++ 14中,我相信'auto p = std :: make_unique (...)'成爲這個的首選成語。 – Nemo