template
class smart_pointer
2 : {
private:
T* m_pRawPointer;
public:
smart_pointer (T* pData) : m_pRawPointer (pData) {}
// Конструктор
7: ~smart_pointer () {delete pData;}; //Деструктор
:
// конструктор копий
smart_pointer (constsmart_pointer & anotherSP);
// Операторприсвоения копии
smart_pointer& operator= (constsmart_pointer& anotherSP);
T& operator* () const // оператор обращения к значению
{
return * (m_pRawPointer) ;
}
576 ЗАНЯТИЕ 26. Понятие интеллектуальных указателей
18
Т* operator-> () const // оператор обращения к члену
return m_pRawPointer;
2 3
Анализ
Приведенный выше класс интеллектуального указателя демонстрирует реализацию этих двух операторов * и ->, объявленных в строках 14-17 и 19-22. Они позволяют этому классу функционировать как “указатель” в обычном смысле. Например, чтобы использо вать интеллектуальный указатель на объект класса Tuna, вы создали бы его экземпляр так:
smart_pointer pSmartTuna (new Tuna); pSmartTuna->Swim();
Альтернатива: (*pSmartDog).Swim ();
Данный класс s m a r t _ p o i n t e r пока еще не имеет и не реализует функциональных возможностей, которые сделали бы его классом достаточно интеллектуального указателя
обеспечили бы его преимущество перед обычным указателем. Конструктор (строка 7) получает указатель, который сохраняется как внутренний объект указателя в классе ин теллектуального указателя. Деструктор освобождает этот указатель, обеспечивая автома тическое освобождение памяти.
Реализация, которая делает интеллектуальный указатель действительно ин теллектуальным, - это конструктор копий, оператор присвоения и деструктор. Именно они определяют поведение объекта интеллектуального указателя, когда он передается в функции, присваивается или выходит из области видимости (т.е. удаляется). Поэтому перед переходом к изучению полной реализации ин теллектуального указателя следует рассмотреть возможные типы интеллектуаль ных указателей.
1Ъ|пыинтеллектуальных указателей
Управление ресурсом памяти (т.е. реализация модели принадлеж ности) и отличает классы интеллектуального указателя. Интеллектуальные указатели решают, что они де лают с ресурсом при их копировании и присвоении. Самые простые реализации зачастую приводят к проблемам производительности, тогда как самые быстрые могут не удовлет ворять требованиям всех приложений. В конце концов, разработчик должен понимать, как функционирует интеллектуальный указатель, прежде чем он реш ит использовать его в своем приложении.
Классификация интеллектуальных указателей фактически основана на их стратегии управления ресурсами памяти.
Глубокого копирования.
Копирования при записи (COW).
Типы интеллектуальных указателей
|
577
|
Подсчета ссылок.
Списка ссылок.
Деструктивного копирования.
Давайте бегло рассмотрим каждую из этих стратегий, прежде чем переходить к изуче нию интеллектуального указателя s t d : :u n iq u e _ p tr , предоставляемого стандартной би блиотекой C++.
Do'stlaringiz bilan baham: |