2012-04-03 8 views
5

私はメンバーを持つクラスがあります。私が書いたコンストラクタでBoost UUIDを使用するとValgrindから初期化されていない値の警告が表示されるのはなぜですか?

std::string mName; 
boost::uuids::uuid mId; 

を:

mName = boost::lexical_cast<std::string>(mId); 

Valgrindのは書いている:

==30714== Use of uninitialised value of size 8 
==30714== at 0x69E92FC: ??? (in /usr/lib/libstdc++.so.6.0.16) 
==30714== by 0x69E93EE: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<unsigned long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, unsigned long) const (in /usr/lib/libstdc++.so.6.0.16) 
==30714== by 0x69E9705: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, unsigned long) const (in /usr/lib/libstdc++.so.6.0.16) 
==30714== by 0x69F522C: std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long) (in /usr/lib/libstdc++.so.6.0.16) 
==30714== by 0x6283A5: std::basic_ostream<char, std::char_traits<char> >& boost::uuids::operator<< <char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, boost::uuids::uuid const&) (uuid_io.hpp:55) 
==30714== by 0x62799D: bool boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, true>::shl_input_streamable<boost::uuids::uuid const>(boost::uuids::uuid const&) (lexical_cast.hpp:1260) 
==30714== by 0x626DB4: bool boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, true>::operator<< <boost::uuids::uuid>(boost::uuids::uuid const&) (lexical_cast.hpp:1431) 
==30714== by 0x6261EE: boost::detail::lexical_cast_do_cast<std::string, boost::uuids::uuid>::lexical_cast_impl(boost::uuids::uuid const&) (lexical_cast.hpp:1920) 
==30714== by 0x62590C: std::string boost::lexical_cast<std::string, boost::uuids::uuid>(boost::uuids::uuid const&) (lexical_cast.hpp:2087) 
==30714== by 0x624145: th::Object::Object(std::string const&) (Object.cpp:25) 
t==30714== Conditional jump or move depends on uninitialised value(s) 

それは何だろうか?

+3

:あなたのデータメンバ宣言を並べ替えることで、より良いまだ

class MyType { std::string mName; boost::uuids::uuid mId; public: MyType() : mName(), // not technically necessary since std::string has a // non-trivial default constructor, but good for consistency mId() // necessary in order to actually initialize mId, remains // uninitialized otherwise { mName = boost::lexical_cast<std::string>(mId); } }; 

または:

あなたが中にあなたのコンストラクタの初期化リストのあなたuuidオブジェクトを値初期化していることを確認しますメモリリークが発生しますが、初期化されていないメモリが使用されます。タイトルは誤解を招く。 – thiton

+0

@thitonよかった、ありがとう。 – Ockonal

答えて

9

boost::uuids::uuidはPODタイプなので、デフォルトの初期化uuidオブジェクトは、実際に初期化されていないままにしておきます。これではありません

class MyType 
{ 
    boost::uuids::uuid mId; 
    std::string mName; 

public: 
    MyType() 
     : mId(), // value-initialize mId 
     mName(boost::lexical_cast<std::string>(mId)) // avoid unnecessary default 
                // construction of mName 
    { } 
}; 
関連する問題