Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Умные указатели - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Проверить, является ли дата правильной http://www.cyberforum.ru/cpp-beginners/thread298235.html
Пожалуйста, помогите добить задачку!:wall: Написать функцию, которая проверяет что переменная типа date содержит правильную дату. Примечание. Год не=0, месяц - типа enum, день=от1 до 31(в...
C++ Помогите с перегрузкой операций. Створити динамічний клас для роботи з рядками. Максимальна довжина послідовності – 254. Перший байт повинен містити інформацію про фактичну кількість елементів масиву. Здійснити перевантаження... http://www.cyberforum.ru/cpp-beginners/thread298229.html
Перегрузка операторов для класса матриц C++
Собственно, суть проблемы. Пишу класс матриц (хочется), оператор присваивания работает только тогда, когда функция (ну или, например, оператор +) возвращает *this и тип возвращаемого значения -...
C++ Перестановка чисел в массиве
задача: дан массив и число x. переставить числа в массиве таким образом, чтобы сначала массива шли числа, меньшие x, затем равные x, в конце - большие x. если не затруднит подскажите алгоритм...
C++ Вывод иероглифов вместо русских символов http://www.cyberforum.ru/cpp-beginners/thread298185.html
ситуация такая вывожу строки на русском с помощью printf() в коде программы, перед этим пишу setlocale(LC_ALL, "") все нормально, но когда в процессе работы программы ввожу русские данные в консоле...
C++ Динамический список опять Уже, наверно, достал с этими списками). Чуть-чуть, вроде осталось). Вот разобрался, в конце концов, как работают в функции в коде ниже. Теперь не понимаю, как их вызвать в функцию main(), Помогите,... подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
17.05.2011, 23:15
Вот ликбез по auto_ptr.

Стандартная библиотека (см. гл. 11) предоставляет шаблон интеллектуального указателя auto_ptr [1-20.4.5], несколько упрощенный интерфейс которого представлен в листинге 8.14. Он реализует совсем другую стратегию владения — разрушающее копирование. Это означает, что в каждый момент времени на объект ссылается только один указатель, и при копировании объект передается от прежнего владельца новому.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Листинг 8.14. Интеллектуальный указатель auto_ptr
template<class T> 
class auto_ptr 
{   public:
     typedef T element_type;
     // Конструкторы
     explicit auto_ptr(T* p = 0);
     auto_ptr(auto_ptr<T> &rhs)
     template <class U> auto_ptr(auto_ptr<U> &rhs);
     ~auto_ptr();                       // деструктор
     // присваивание
     template <class U>
     auto_ptr<T>& operator=(auto_ptr<U> &rhs);
     void reset(T* p = 0);              // смена владельца
     T* release();                      // отказаться от владения
     T & operator*() const;                 
     T * operator->() const;                
     T * get() const;                   // получить указатель
     void swap(auto_ptr & b);           // обмен
// преобразование типа
    template<class Other>
    operator auto_ptr<Other>()
    { return auto_ptr<Other>(pointer); }
template <class U> friend class auto_ptr;
};
В настоящей реализации все методы прописаны со спецификацией исключений throw(), то есть гарантированно не возбуждают исключений.
Обратите внимание на операцию преобразования типа. Она делает все указатели auto_ptr «родственниками». Она нам необходима, поскольку и конструкторы копирования, и операции присваивания сделаны шаблонными. Кроме того, все классы auto_ptr являются друзьями друг друга.
Метод release() «отказывается» от владения, возвращая указатель (листинг 8.15).
C++
1
2
3
4
5
6
7
Листинг 8.15. Метод release() — отказ от владения
template<class T>
inline T* auto_ptr<T>::release()
{  T* OldPtr = pointer;
   pointer = 0;                     // отказываемся от владения
   return OldPtr;
}
Нас, однако, интересует, в первую очередь, конструкторы копирования и операции присваивания (листинг 8.16).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Листинг 8.16. Копирование и присваивание в шаблоне auto_ptr
template <class T>
inline auto_ptr<T>::auto_ptr(auto_ptr<T> &rhs)
{ pointer = rhs.pointer;    // вступили во владение
  rhs.pointer = 0;          // прежний владелец – больше не владелец
}
template <class T>
template <class U>
inline auto_ptr<T>::auto_ptr(auto_ptr<U> &rhs)
: pointer(rhs.release())    // вступили во владение
{ }
template <class T>
template <class U>
inline auto_ptr<T>& auto_ptr<T>::operator=(auto_ptr<U> &rhs)
{ if (this != &rhs) reset(rhs.release());
  return *this; 
}
Обратите внимание, что передаваемые по ссылке параметры — не константы. Так и должно быть, чтобы можно было «лишить владения» — обнулить указатель параметра.
Такая реализация имеет несколько следствий. Как и описанный выше scoped_ptr, auto_ptr совершенно безопасен с точки зрения утечки памяти, например
C++
1
2
void f()
{  auto_ptr<T> pt(new T); }
И в данном случае тоже ничего не «утекает», так как при выходе из функции просто вызывается деструктор auto_ptr, который и удаляет объект.
Как и scoped_ptr, auto_ptr нельзя передавать в качестве параметров по значению. Так как при передаче по значению происходит копирование, то исходный указатель перестает быть «владельцем» объекта. Однако возвращать указатель по значению вполне безопасно:
C++
1
2
auto_ptr<T> f()
{  return auto_ptr<T> pt(new T); }
Несмотря на то, что операция присваивания открыта, объекту auto_ptr нельзя присвоить адрес объекта, созданного с помощью оператора new. Как и для scoped_ptr нужно использовать функцию reset(), которой можно передать указатель или 0, если мы хотим обнулить объект auto_ptr. Если auto_ptr указывает на объект и является его владельцем, то этот объект уничтожается перед присваиванием нового значения внутреннему указателю auto_ptr.
4
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru