Семантические значения std :: auto_ptr и boost :: shared_ptr - PullRequest
0 голосов
/ 31 января 2012

В нашем большом проекте у нас есть класс лотов со следующими typedef:

class Foo
{
  public:
    typedef std::auto_ptr<Foo> Ptr;
    typedef boost::shared_ptr<Foo> Ref;
  ...
};
...
Foo::Ref foo(new Foo);
...
doBar(foo);
...

Использование их очень удобно.Но я сомневаюсь, что auto_ptr семантически близок к Ptr и shared_ptr совпадает с ref?Или auto_ptr следует использовать явно, так как он имеет семантику "передачи права собственности"?

Спасибо,

Ответы [ 5 ]

2 голосов
/ 31 января 2012

std::auto_ptr имеет семантику передачи прав собственности, но она довольно нарушена. Если вы можете использовать boost::shared_ptr, тогда вы должны использовать boost::unique_ptr вместо std::auto_ptr, поскольку он делает то, что ожидалось. Он передает владение , а делает предыдущий экземпляр недействительным, а std::auto_ptr - нет.

Еще лучше, если вы сможете использовать C ++ 11, затем переключитесь на std::unique_ptr и std::shared_ptr.

1 голос
/ 31 января 2012

Вы не должны использовать std::auto_ptr, он устарел, и я считаю его опасным, тем более, когда вы прячете его за такой универсальной typedef, как Ptr.

Я не думаю, что это делаетлюбой смысл называть shared_ptr Ref, в этом случае это больше Ptr, чем auto_ptr.

РЕДАКТИРОВАТЬ: я считаю это опасным, потому что вы можете легко использовать его неправильно, даже если вы полностью понимаете его работу,Вы можете случайно использовать его, особенно когда прячете за typedef.Хороший класс должен быть простым в использовании, а трудно использовать .Особенно с появлением unique_ptr Я не вижу никакого полезного сценария для auto_ptr.

0 голосов
/ 31 января 2012

Многое зависит от того, для чего они используются.И в случае Ref, что люди понимают под этим.В предстандартные дни я часто использовал typedef для Ptr для моего (инвазивного) указателя подсчета ссылок;наличие такой typedef фактически указывало на то, что тип поддерживает подсчет ссылок и что он всегда должен выделяться динамически.

И std::auto_ptr, и boost::shared_ptr имеют очень особую семантику.Я бы не стал использовать для них typedef, как из-за особой семантики, так и потому, что (в отличие от моего подсчитанного указателя на инвазивные ссылки) они полностью независимы от указанного типа.Для любого типа вы можете использовать их или нет, как того требует логика программы.(Из-за его особой семантики я нахожу достаточное количество применений для std::auto_ptr. Однако я склонен избегать boost::shared_ptr, но это довольно опасно.)

0 голосов
/ 31 января 2012

Я считаю, что заказ - это просто номенклатура, которую кто-то использовал.
Вероятно, это должно было быть ref для auto_ptr и ptr для shared_ptr, потому что:

Ссылки являются неизменными и, следовательно, не могут быть сделаны для ссылки на другой объект. auto_ptr имеет аналогичную (хотя и отдаленно похожую) семантику, передачу собственности, что означает, что вы, вероятно, не захотите назначать auto_ptr для неинтуитивного поведения, которое оно показывает. Назначенный объект получает право собственности, в то время как назначаемый объект теряет собственность.

С другой стороны, shared_ptr имеет механизм подсчета ссылок, который похож (опять же удаленно) на несколько указателей, которые могут указывать на один и тот же объект. Владение указателем остается за самим shared_ptr, и он освобождается, как только на него не ссылаются экземпляры указателя.

0 голосов
/ 31 января 2012

auto_ptr устарела в C ++ 11.Возможно, вы захотите прекратить использовать его и просто использовать shared_ptr.Для shared_ptr передача права собственности на присвоение отсутствует, подсчитывается количество ссылок на объект и объект уничтожается при уничтожении последнего указателя.

...