Следующий код падает. Так и задумано?
#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));
}
Здравствуйте, 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 потерял владельца и удалил выделенную память. бум!