0

現在、std::ostringstream を std::unique_ptr にラップしようとしています。現在のコードはコンパイルされますが、実行時にセグメンテーション エラーが発生します。

古い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);

どちらの場合も operator<< へのポインターを渡していますが、私は間違っているようです。

どこが間違っていますか?

ご協力いただきありがとうございます :)

注: シンクとソースのパターンを実装するために unique_ptr を使用したかったのです。

4

1 に答える 1

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);
于 2014-07-18T23:01:20.410 に答える