Можно ли смешивать scoped_ptr и shared_ptr? - PullRequest
2 голосов
/ 02 сентября 2010

Представьте, что я создаю экземпляр Foo в куче в методе / функции и передаю его вызывающей стороне.Какой вид smartpointer я бы использовал?

smartptr new_foo() {
    smartptr foo = new Foo();
    return foo;
}

void bar() {
    smartptr foo = new_foo();
    foo->do_something();
    // now autodelete foo, don't need it anymore
}

Хорошо ... сейчас: насколько я понимаю, эти smartpointers из boost, scoped_ptr должны быть теми, которые будут использоваться в bar ().Но я не могу создать его в foo (), так как он не копируется.Поэтому я должен создать shared_ptr в foo () и вернуть его.Но нужно ли мне теперь использовать shared_ptr в bar (), или я могу просто «привести» его к shared_ptr в bar ()?

Редактировать

Спасибопока ваши ответы!Итак, теперь у меня есть два решения:

  • Использовать только boost::shared_ptr
  • Использовать std::auto_ptr в генераторе foo () и boost::shared_ptr в баре ()

С уважением, я предпочитаю решение только для повышения и не буду смешивать его с STL, за исключением того, что для этого есть действительно веские причины.Итак, следующий вопрос: имеет ли смешанное решение какое-либо преимущество перед решением только для повышения?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

форсированные документы предполагают, что они не смешиваются

. Если вы передаете право собственности, то на данный момент другой вариант будет auto_ptr, например,

smartptr new_foo() { 
    std::auto_ptr<Foo> foo = new Foo(); 
    return foo; 
} 

void bar() { 
    std::auto_ptr<Foo> foo = new_foo(); 
    foo->do_something(); 
    // now autodelete foo, don't need it anymore 
} 

, однако это будет ограничивать использование.new_foo () т.е. вы не можете использовать его для заполнения контейнера (без управления ресурсом каким-либо другим способом).: (

С ссылками на C ++ 0x и rvalue это будет работа для unique_ptr, которая заменит auto_ptr и просто сделает то, что вы хотите

1 голос
/ 02 сентября 2010

Использование boost::shared_ptr

...