Это - хорошая практика для передачи scoped_ptr ссылкой (от одного метода до другой внутренней части класс)?

Или если я должен сделать это, затем я должен просто использовать shared_ptr?

6
задан amitlicht 28 June 2015 в 14:39
поделиться

2 ответа

Да, вы можете передать это по ссылке.

Однако, если функция просто хочет использовать управляемый объект, вы можете рассмотреть возможность передачи ссылки на сам объект.

void foo(const boost::scoped_ptr<Object>& o)
{
     o->foobar();
}

void bar(const Object& o)
{
     o.foobar();
}

Разница в том, что в первом случае вы связали функцию с определенным типом интеллектуального указателя.

Object o;
boost::scoped_ptr<Object> scoped(new Object);
boost::shared_ptr<Object> shared(new Object);

foo(o);  //no
foo(scoped); //OK
foo(shared); //no

bar(o);  //OK
bar(*scoped); //OK
bar(*shared); //OK

Обычно я передаю только scoped_ptr , если намеревается что-то сделать с самим экземпляром scoped_ptr (например, освободить или сбросить ресурс). Аналогично для shared_ptr (например, функция хочет поделиться ресурсом с другими общими указателями).

10
ответ дан 8 December 2019 в 05:20
поделиться

Можно безопасно передавать scoped_ptr по ссылке, если вызываемому объекту не нужно хранить обернутый указатель, и он просто использует его для вызова некоторых методов. Объект, охраняемый scoped_ptr , будет уничтожен, когда он выйдет из области видимости - либо в конце вызывающей функции, если указатель был переменной стека, либо при освобождении содержащего его экземпляра класса, если он был переменная-член.

Как правило, интеллектуальные указатели используются для управления владением объектами , так что вот краткий обзор:

  • boost :: scoped_ptr ограничивает время жизни охраняемого объекта охватывающей областью видимости, есть только один владелец.
  • С std :: auto_ptr одновременно может быть только один владелец, но он позволяет передавать право собственности через присваивание (как параметр функции или возвращаемое значение). {{1 }}
  • boost :: shared_ptr поддерживает совместное владение посредством подсчета ссылок, охраняемый объект уничтожается только тогда, когда счетчик ссылок становится равным нулю. Это наиболее универсальный интеллектуальный указатель, но также и самый дорогой, поскольку он несет незначительные накладные расходы (счетчик ссылок поддерживается атомарными операциями, что довольно дорого). Также существует возможность циклических зависимостей.
  • boost :: weak_ptr - это не владеющий интеллектуальный указатель, который можно обновить до boost :: shared_ptr во время выполнения с проверкой того, что охраняемый объект все еще жив. { {1}}

Существуют также варианты массивов, такие как boost :: shared_array , поскольку C ++ имеет отдельные функции освобождения для одного и нескольких объектов ( оператор delete vs. оператор delete [] .)

Интеллектуальные указатели поддерживают Resource Acquisition Is Initialization , или идиому RAII, которая является способом предоставления гарантий безопасности исключений .

13
ответ дан 8 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: