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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.77
Koketka
5 / 5 / 0
Регистрация: 27.11.2009
Сообщений: 232
17.05.2011, 23:04     Умные указатели #1
Здравствуйте!
вопрос указатель auto_ptr почитала литературу, там написано он считывает и удаляет ссылки, т.е.
он получает какие-то ресурсы, работает с ними и освобождает память??так?

я его использую
C++
1
2
3
4
5
6
7
8
class A : public B{  
private:
    auto_ptr<MyStream> head;
public:
    A(MyStream* MyHead);
    ~A();
 .....
};
и вот такая ф-ия:
C++
1
2
A::A(MyStream *MyHead) : head(MyHead){
}
можете пожалуйста вот на этом примере объясниь как он конкретно работает?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2011, 23:04     Умные указатели
Посмотрите здесь:

C++ Через указатели на указатели посчитать сумму двух чисел и записать в третье
Указатели и указатели на указатели, а также типы данных C++
Умные указатели C++
C++ умные указатели
C++ Компиляция Sqlite3.dll в Visual C++ 6. Нужны умные головы профессионалов
C++ хочу написать программу,нужны умные мозги)
C++ Умные указатели
C++ Умные указатели на структуру с шаблоном

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
17.05.2011, 23:15     Умные указатели #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот ликбез по 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.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
17.05.2011, 23:32     Умные указатели #3
Простейшая реализация шаблона:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
template <class ValueType>
class AutoPointer {
 public:
  AutoPointer() : data_(NULL) {}
  explicit AutoPointer(ValueType *data) : data_(data) {}
  ValueType *Get() { return data_; }
  void Reset(ValueType *pointer = NULL) {
    delete data_;
    data_ = pointer;
  }
  ValueType *Release() {
    ValueType *result = data_;
    data_ = NULL;
    return result;
  }
  ValueType &operator*() { return *data_; }
  ValueType *operator->() { return data_; }
  AutoPointer &operator=(AutoPointer &other) {
    if (&other != this) {
      Reset();
      data_ = other.Release();
    }
    return *this;
  }
  template <class OtherValueType>
  operator AutoPointer<OtherValueType>() {
    return AutoPointer<OtherValueType>((OtherValueType*)data_);
  }
 private:
  ValueType *data_;
};
 
int main(int argc, char **argv) {
  AutoPointer<int> a(new int), b(new int);
 
  *a = 10;
  *b = 5;
 
  std::cout << "a: " << a.Get() << ": " << *a << std::endl
            << "b: " << b.Get() << ": " << *b << std::endl;
 
  a = b;
 
  std::cout << "a: " << a.Get() << ": " << *a << std::endl
            << "b: " << b.Get() << ": " << "NO DATA" << std::endl;
  return 0;
}
Yandex
Объявления
17.05.2011, 23:32     Умные указатели
Ответ Создать тему
Опции темы

Текущее время: 06:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru