Here is a function that I am trying to understand why its giving me a
error via valgrind of "Invalid read of size 4".
16: Trace_State::ptr_t Trace_State::Instance()
17: {
18: // Lock the resource?
19: if ( m_instance.get() == 0 )
20: {
21: m_instance = Trace_State::ptr_t ( new
Trace_State() );
22: }
23:
24: // Unlock the resource?
25:
26: return m_instance;
27: }
When I look at the full error report I see:
==10721== Invalid read of size 4
==10721== at 0x41682E3: boost::detail::atomic_increment(int*) (sp_counted_base_gcc_x86.hpp:66)
==10721== by 0x4168359: boost::detail::sp_counted_base::add_ref_copy() (sp_counted_base_gcc_x86.hpp:133)
==10721== by 0x41684B1: boost::detail::shared_count::shared_count(boost::detail::shared_count const&) (shared_count.hpp:170)
==10721== by 0x41775CF: boost::shared_ptrlibreverse::trace::Trace_State::shared_ptr(boost::shared_ptrlibreverse::trace::Trace_State const&) (shared_ptr.hpp:106)
==10721== by 0x41772F0: libreverse::trace::Trace_State::Instance() (Trace.cpp:26)
==10721== by 0x417731B: libreverse::trace::Trace::write_Trace(unsigned, std::string) (Trace.cpp:180)
==10721== by 0x425E394: libreverse::elf_module::Elf_Reader<32>::~Elf_Reader() (Elf_Reader_T.cpp:52)
==10721== by 0x423C8FD: void boost::checked_delete >(libreverse::elf_module::Elf_Reader<32>*) (checked_delete.hpp:34)
==10721== by 0x42480B8: boost::detail::sp_counted_impl_p >::dispose() (sp_counted_impl.hpp:76)
==10721== by 0x804C207: boost::detail::sp_counted_base::release() (sp_counted_base_gcc_x86.hpp:145)
==10721== by 0x804C231: boost::detail::shared_count::~shared_count() (shared_count.hpp:159)
==10721== by 0x423C171: boost::shared_ptrlibreverse::io::File_Reader::~shared_ptr() (shared_ptr.hpp:106)
==10721== Address 0x43F7A44 is 12 bytes inside a block of size 24 free'd
==10721== at 0x40050FF: free (vg_replace_malloc.c:233)
==10721== by 0x4185AC5: operator delete(void*) (sp_debug_hooks.cpp:205)
==10721== by 0x417C9A4: boost::detail::sp_counted_impl_plibreverse::trace::Trace_State::~sp_counted_impl_p() (sp_counted_impl.hpp:52)
==10721== by 0x4168337: boost::detail::sp_counted_base::destroy() (sp_counted_base_gcc_x86.hpp:126)
==10721== by 0x804C1CD: boost::detail::sp_counted_base::weak_release() (sp_counted_base_gcc_x86.hpp:159)
==10721== by 0x804C212: boost::detail::sp_counted_base::release() (sp_counted_base_gcc_x86.hpp:146)
==10721== by 0x804C231: boost::detail::shared_count::~shared_count() (shared_count.hpp:159)
==10721== by 0x4168EBB: boost::shared_ptrlibreverse::trace::Trace_State::~shared_ptr() (shared_ptr.hpp:106)
==10721== by 0x4176711: __tcf_1 (Trace.cpp:14)
==10721== by 0x47BDCBE8: __cxa_finalize (in /lib/libc-2.5.so)
==10721== by 0x4167192: (within /usr/local/lib/libreverse.so.0.0.0)
==10721== by 0x429EE3B: (within /usr/local/lib/libreverse.so.0.0.0)
==10721==
The error is coming when the return of the Trace boost shared ptr. I am
wondering if I have made an error in the creation of the class. Here is
how the class is defined:
#ifndef LIBREVERSE_TRACE_H
#define LIBREVERSE_TRACE_H
#include
#include
#include <fstream>
#include "Reverse.h"
namespace libreverse { namespace trace {
/* Idea taken from http://www.codeproject.com/debug/xytrace.asp
* (28 Jan 2002 - Xiangyang Liu)
*
* I have modified this so that we don't use varargs and use constant types
*/
class Trace_State {
public:
typedef boost::shared_ptr ptr_t;
virtual ~Trace_State();
static Trace_State::ptr_t Instance();
void set_Trace_File_Prefix ( std::string name );
void set_Trace_Level ( boost::uint32_t level );
void open_Trace_File ( void );
std::string get_ID_String ( void );
void close_Trace_File ( void );
boost::uint32_t get_Trace_Level ( void ) const;
void write_Message ( boost::uint32_t level, std::string msg );
private:
Trace_State();
static Trace_State::ptr_t m_instance;
std::string m_file_prefix;
boost::uint32_t m_trace_level;
//boost::recursive_mutex m_mutex;
std::ofstream m_log_stream;
};
class Trace {
public:
static bool write_Trace ( boost::uint32_t level,
std::string message );
};
} /* namespace trace */
} /* namespace libreverse */
#endif /* LIBREVERSE_TRACE_H */
Is this an appropriate way to create a class using the singleton
pattern? Is the constructor assigning the boost shared_ptr?
Stephen