$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] boost::exception - leaking error_info
From: Emil Dotchevski (emildotchevski_at_[hidden])
Date: 2009-02-20 22:17:55
On Fri, Feb 20, 2009 at 3:00 PM, Bruce Laing
<bruce.laing_at_[hidden]> wrote:
> This program seems to be leaking boost::exception::error_info objects.
> Is there something missing here?
>
> - Bruce
>
>
>   typedef boost::error_info< struct tag_my_error, std::string >
> some_error_info;
>
>   struct an_exception : public boost::exception, public std::exception {};
>
>   void throw_func()
>   {
>       BOOST_THROW_EXCEPTION
>       (
>          an_exception()
>              // no leak if next line is commented out.
>              << some_error_info( std::string( "error message" ) )
>       );
>   }
> .
> .
> .
>   BOOST_AUTO_TEST_CASE( test_exceptions )
>   {
>       try
>       {
>           throw_func()
>       }
>       catch( an_exception&  )
>       {
>       }
>   }
What platform? Do you have a complete program that shows the problem?
This test seems to work as expected:
#include "boost/exception.hpp"
class
counter
        {
        int & c_;
        counter & operator=( counter const & );
        public:
        explicit
        counter( int & c ):
                c_(c)
                {
                ++c_;
                }
        counter( counter const & x ):
                c_(x.c_)
                {
                ++c_;
                }
        ~counter()
                {
                --c_;
                }
        };
typedef boost::error_info< struct tag_my_error, counter > some_error_info;
struct an_exception : public boost::exception, public std::exception {};
int c;
void
throw_func()
        {
        BOOST_THROW_EXCEPTION
                (
                an_exception() << some_error_info( counter(c) )
                );
        }
int
main()
        {
        c=0;
        try
                {
                throw_func();
                }
        catch( an_exception & )
                {
                assert(c>0);
                }
        assert(!c);
        }
Emil Dotchevski
Reverge Studios, Inc.
http://www.revergestudios.com/reblog/index.php?n=ReCode