boost::shared_ptr и boost::adaptors -- неожиданное поведение
От: endight  
Дата: 28.04.12 14:30
Оценка:
Следующий код падает. Так и задумано?
#include <vector>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>

struct foo{
    foo(int _i):
        i(_i){}
    virtual void bar() const{
         std::cout << "foo::bar::i " << i << std::endl;
    }
    int i;
};

typedef boost::shared_ptr<foo> foo_ptr;
//typedef foo* foo_ptr;
foo_ptr trasform(int i){
    return foo_ptr(new foo(i));
}
int main(){
    std::vector<int> vec;
    vec.push_back(1);

    using namespace boost::adaptors; using boost::bind;
    boost::for_each(vec
                    | transformed(bind(&trasform, _1))
                    | indirected,
            bind(&foo::bar, _1));
}
с++ boost adaptors
Re: boost::shared_ptr и boost::adaptors -- неожиданное повед
От: coba  
Дата: 28.04.12 20:53
Оценка:
Здравствуйте, endight, Вы писали:


E>Следующий код падает. Так и задумано?

E>
E>#include <vector>
E>#include <boost/range/adaptor/indirected.hpp>
E>#include <boost/range/adaptor/transformed.hpp>
E>#include <boost/range/algorithm/for_each.hpp>
E>#include <boost/bind.hpp>
E>#include <boost/shared_ptr.hpp>

E>struct foo{
E>    foo(int _i):
E>        i(_i){}
E>    virtual void bar() const{
E>         std::cout << "foo::bar::i " << i << std::endl;
E>    }
E>    int i;
E>};

E>typedef boost::shared_ptr<foo> foo_ptr;
E>//typedef foo* foo_ptr;
E>foo_ptr trasform(int i){
E>    return foo_ptr(new foo(i));
E>}
E>int main(){
E>    std::vector<int> vec;
E>    vec.push_back(1);

E>    using namespace boost::adaptors; using boost::bind;
E>    boost::for_each(vec
E>                    | transformed(bind(&trasform, _1))
E>                    | indirected,
E>            bind(&foo::bar, _1));
E>}
E>


я думаю что — Да, именно так задуманно, потому как в тот момент как ты разыменовал с помощью indirected shared_ptr и результат сохранил в конвеер(pipe), shared_ptr потерял владельца и удалил выделенную память. бум!
http://agilemanifesto.org/iso/ru/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.