【问题标题】:Why do I get uninitialized-value warnings from Valgrind when I use Boost UUID?为什么我在使用 Boost UUID 时会收到来自 Valgrind 的未初始化值警告?
【发布时间】:2012-04-17 13:25:00
【问题描述】:

我有一个有成员的班级:

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)

会是什么?

【问题讨论】:

  • 这不是内存泄漏,而是使用了未初始化的内存。标题具有误导性。

标签: c++ boost valgrind boost-uuid


【解决方案1】:

boost::uuids::uuid 是一种 POD 类型,因此 default-initializing uuid 对象实际上会使其未初始化。

确保您在构造函数的初始化列表中值初始化 uuid 对象:

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);
    }
};

或者更好的是,通过重新排序您的数据成员声明:

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
    { }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多