Boost logo

Boost Users :

Subject: [Boost-users] [bind] counterintuitive behavior with vector and auto_ptr
From: Christian Henning (chhenning_at_[hidden])
Date: 2010-06-12 01:41:12


Hi there, I'm doing some job interview preparations. Always a good
idea to go back to the basics and tinker around a bit. I came across a
surprising behavior when using std::vector, std::auto_ptr, and
boost::bind.

Basically, I have a vector of auto_ptrs which is copied into a second
vector, thus the first vector's auto_ptr loss their resource and point
to nowhere. Basic stuff, as I said. Now, when I try to use an auto_ptr
from the first vector using boost::bind everything still works.
Meaning the code doesn't fail, although it should. I find that
surprising. Why is boost::bind recreating the resource?

Here is a my example code:

#include <algorithm>
#include <iostream>
#include <vector>

#include <boost/bind.hpp>

using namespace std;

struct A
{
    A() { cout << "A::A();"; }
    ~A() { cout << "A::~A();"; }
    void foo() { cout << "A::foo();"; }

};

auto_ptr< A > allocate_A()
{
    return auto_ptr<A>( new A() );
}

void call_foo( auto_ptr< A > p )
{
    p->foo();
}

int main()
{
    std::vector< auto_ptr< A > > v( 100 );
    generate_n( v.begin(), 100, allocate_A );

    for_each( v.begin(), v.end(), boost::bind( &A::foo, _1 ));

    std::vector< auto_ptr< A > > v2( 100 );
    copy( v.begin(), v.end(), v2.begin() );

    // auto_ptr in v should be empty now.

    // this fails
    //v[0]->foo();

    // this fails
    //for_each( v.begin(), v.end(), call_foo );

    // this doesn't fail
    for_each( v.begin(), v.end(), boost::bind( &A::foo, _1 ));

    return 0;
}

I'm using MSVC10 Express.

Regards,
Christian


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net