Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/89: Рейтинг темы: голосов - 89, средняя оценка - 4.83
5 / 5 / 1
Регистрация: 27.11.2009
Сообщений: 232

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

17.05.2011, 23:04. Показов 18884. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
вопрос указатель 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){
}
можете пожалуйста вот на этом примере объясниь как он конкретно работает?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2011, 23:04
Ответы с готовыми решениями:

Умные указатели
Привет. Что-то разобраться до конца не могу, тк умных указателей не так то мало оказывается. Мне интересно, если я выделяю память под...

Умные указатели
Насколько я понял для того что бы предотвратить передачу права владения используют const. Код из примера: template &lt;class T&gt; ...

умные указатели
у меня например есть куча юнитов, у каждого из них есть указатель на игровой ресурс (допустим камень). Есть такая задумка: когда камень...

2
Эксперт С++
1069 / 848 / 60
Регистрация: 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.
5
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
17.05.2011, 23:32
Простейшая реализация шаблона:
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;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2011, 23:32
Помогаю со студенческими работами здесь

Умные указатели
#include &lt;fstream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;memory&gt; using namespace std; ...

Умные указатели
Разбираюсь с умными указателями. Попытался переписать кусок кода используя shared_ptr. Было Btree::Btree() { m_root=nullptr; } ...

Умные указатели
Правильно ли я понял, что умный указатель - это просто шаблон класса, содержащий в себе указатель Type *p и его delete в деструкторе?

Умные указатели
Пишу класс дерево поиска:template&lt;typename T, typename Compare&gt; class AvlTree { private: struct Node { T...

Прата и умные указатели
Читаю Прата С. - Язык программирования С++. Лекции и упражнения - 2011, стр. 886: Пишу, компилирую - получаю ошибки: Кто не прав...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru