Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

scoped_ptr

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

scoped_ptr class template

scoped_ptrшаблон класса хранит указатель на динамически выделенный объект. (Динамически выделенные объекты выделены с помощью C++)новое выражение. Указанный объект гарантированно удаляется либо при уничтоженииscoped_ptr, либо посредством явногосброса.. Смотрите пример.

Шаблонscoped_ptrявляется простым решением для простых потребностей. Он обеспечивает базовую установку «приобретение ресурсов — это инициализация» без семантики совместного владения или передачи собственности. Как его название, так и применение семантики (будучинекопируемым) сигнализируют о его намерении сохранить право собственности исключительно в пределах текущей области. Поскольку этонекопируемое, это безопаснее, чемshared_ptrилиstd::auto_ptrдля указателей, которые не должны копироваться.

Посколькуscoped_ptrпрост, в его обычной реализации каждая операция так же быстра, как и для встроенного указателя, и у него больше нет места над головой, чем у встроенного указателя.

scoped_ptrне может использоваться в контейнерах стандартной библиотеки C++. Используйтеshared_ptr, если вам нужен умный указатель, который может.

scoped_ptrне может правильно удерживать указатель на динамически выделенном массиве. См.scoped_arrayдля этого использования.

Шаблон класса параметризован наТ, тип объекта, на который указывается.Tдолжен соответствовать общим требованиям.

Synopsis

namespace boost {
  template<class T> class scoped_ptr : noncopyable {
   public:
     typedef T element_type;
     explicit scoped_ptr(T * p = 0); // never throws
     ~scoped_ptr(); // never throws
     void reset(T * p = 0); // never throws
     T & operator*() const; // never throws
     T * operator->() const; // never throws
     T * get() const; // never throws
     
     operator unspecified-bool-type() const; // never throws
     void swap(scoped_ptr & b); // never throws
  };
  template<class T> void swap(scoped_ptr<T> & a, scoped_ptr<T> & b); // never throws
}

Members

element_type

typedef T element_type;

Предоставляет тип хранимого указателя.

constructors

explicit scoped_ptr(T * p = 0); // never throws

Конструируетscoped_ptr, сохраняя копиюp, которая должна быть выделена через новое выражениеC++или быть 0.Tне обязательно должен быть полным типом. Умный указательОбщие требования.

destructor

~scoped_ptr(); // never throws

Уничтожает объект, на который указывает сохраненный указатель, если таковой имеется, как если бы с помощьюудалить это->get().

Гарантия того, что это не делает исключений, зависит от требования, чтобы деструктор удаленного объекта не выбрасывал исключений. Умный указательОбщие требования.

reset

void reset(T * p = 0); // never throws

Удалите объект, на который указывает сохраненный указатель, а затем сохраните копию p, которая должна была быть выделена через C++.новоевыражение или быть 0. Гарантия того, что это не делает исключений, зависит от требования, чтобы деструктор удаленного объекта не выбрасывал исключений. Умный указательОбщие требования.

indirection

T & operator*() const; // never throws

Возвращает ссылку на объект, на который указывает сохраненный указатель. Поведение не определено, если сохраненный указатель равен 0.

T * operator->() const; // never throws

Возвращает сохраненный указатель. Поведение не определено, если сохраненный указатель равен 0.

get

T * get() const; // never throws

Возвращает сохраненный указатель.Тне обязательно должен быть полным типом. Умный указательОбщие требования.

conversions

operator unspecified-bool-type () const; // never throws

Возвращает неопределенное значение, которое при использовании в булевом контексте эквивалентно<get() != 0>.

swap

void swap(scoped_ptr & b); // never throws

Обменяется содержанием двух умных указателей.Тне обязательно должен быть полным типом. Умный указательОбщие требования.

Free Functions

swap

template<class T> void swap(scoped_ptr<T> & a, scoped_ptr<T> & b); // never throws

a.swap(b). Соответствует интерфейсуstd::swap. Предоставляется в качестве помощи для общего программирования.

Example

Вот пример, который используетscoped_ptr.

#include <boost/scoped_ptr.hpp>
#include <iostream>
struct Shoe { ~Shoe() { std::cout << "Buckle my shoe\n"; } };
class MyClass {
    boost::scoped_ptr<int> ptr;
  public:
    MyClass() : ptr(new int) { *ptr = 0; }
    int add_one() { return ++*ptr; }
};
int main()
{
    boost::scoped_ptr<Shoe> x(new Shoe);
    MyClass my_instance;
    std::cout << my_instance.add_one() << '\n';
    std::cout << my_instance.add_one() << '\n';
}

Пример программы производит начало детской рифмы ребенка:

1
2
Buckle my shoe

Rationale

Основная причина использованияscoped_ptr, а неauto_ptrзаключается в том, чтобы дать читателям вашего кода знать, что вы намереваетесь применять «приобретение ресурсов является инициализацией» только для текущей области применения и не намерены передавать право собственности.

Вторичная причина для использованияscoped_ptrзаключается в том, чтобы помешать более позднему программисту технического обслуживания добавить функцию, которая передает право собственности, возвращаяauto_ptr, потому что программист технического обслуживания виделauto_ptr, и предполагаемое право собственности может быть безопасно передано.

Подумайте оboolvsint. Мы все знаем, что под одеяломboolобычно находитсяint. Действительно, некоторые возражали против включенияboolв стандарт C++ из-за этого. Но, кодируяbool, а неint, вы говорите своим читателям, каковы ваши намерения. То же самое сscoped_ptr; используя его, вы сигнализируете о намерении.

Было высказано предположение, чтоscoped_ptrэквивалентноstd::auto_ptr< T>const. Эдди Брей указал, однако, чтосбросне будет работать наstd::auto_ptrconst.

Handle/Body Idiom

Одним из распространенных примененийscoped_ptrявляется реализация идиомы «ручка/тело» (также называемой pimpl), которая позволяет избежать раскрытия тела (реализации) в файле заголовка.

Программа выборкиscoped_ptr_example_test.cppвключает файл заголовкаscoped_ptr_example.hpp, который используетscoped_ptr<>для скрытия реализации. Инстантификация функций-членов, требующих полного типа, происходит в файле реализацииscoped_ptr_example.cpp.

Frequently Asked Questions

Q. Почемуscoped_ptrне имеет релиза()?
A. При чтении исходного кода важно уметь делать выводы о поведении программы на основе используемых типов. Если быscoped_ptrимел(а) участник(а) выпуска, стало бы возможным передать право собственности на удерживаемый указатель, ослабляя его роль как способа ограничения ресурсного срока службы данным контекстом. Используйтеstd::auto_ptr, где требуется передача права собственности. (перенаправлено с «Dave Abrahams»)


Дата $

Авторское право 1999 Грег Колвин и Беман Доуз. Авторское право 2002 Дарин Адлер. Авторское право 2002-2005 годы Питер Димов. Распространяется под лицензией Boost Software License, версия 1.0. См. сопроводительный файлLICENSE_1_0.txtили копию наhttp://www.boost.org/LICENSE_1_0.txt

Статья scoped_ptr раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:57:20/0.026893854141235/1