Или если я должен сделать это, затем я должен просто использовать shared_ptr?
Да, вы можете передать это по ссылке.
Однако, если функция просто хочет использовать управляемый объект, вы можете рассмотреть возможность передачи ссылки на сам объект.
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
(например, функция хочет поделиться ресурсом с другими общими указателями).
Можно безопасно передавать 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, которая является способом предоставления гарантий безопасности исключений .