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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Проверить, является ли дата правильной http://www.cyberforum.ru/cpp-beginners/thread298235.html
Пожалуйста, помогите добить задачку!:wall: Написать функцию, которая проверяет что переменная типа date содержит правильную дату. Примечание. Год не=0, месяц - типа enum, день=от1 до 31(в большинстве месяцев). Прога работает, но не совсем верно: например, если ввести 31 февраля (или апреля и т.п.) - выдаст, что дата верна. #include "stdafx.h" #include<iostream>
C++ Помогите с перегрузкой операций. Створити динамічний клас для роботи з рядками. Максимальна довжина послідовності – 254. Перший байт повинен містити інформацію про фактичну кількість елементів масиву. Здійснити перевантаження операцій: " = "– присвоєння, " + " – конкатенація (з’єднання) рядків, " <= " – відношення "менше чи дорівнює", " >= " – відношення "більше чи дорівнює", " == " – відношення "дорівнює", " != " –... http://www.cyberforum.ru/cpp-beginners/thread298229.html
Перегрузка операторов для класса матриц C++
Собственно, суть проблемы. Пишу класс матриц (хочется), оператор присваивания работает только тогда, когда функция (ну или, например, оператор +) возвращает *this и тип возвращаемого значения - ссылка. Иначе, выдаёт: a.out(1181) malloc: *** error for object 0x7fff5fbffa40: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug Abort trap Конструктор...
C++ загрузка из файла не работает
пишу в Qt 4.7, никак не могу написать загрузку из файла, сохранение вроде бы работает, но я не уверена, но загрузка вообще никак. при нажатии в меню Load окно моё закрывается, может подскажете, что я не так делаю? void newForm::Load () { QString fileName = QFileDialog::getOpenFileName (0, "Open Dialog", "", "*.tbl"); if (fileName.length ()) { QFile file (fileName); ...
C++ перестановка чисел в массиве http://www.cyberforum.ru/cpp-beginners/thread298202.html
задача: дан массив и число x. переставить числа в массиве таким образом, чтобы сначала массива шли числа, меньшие x, затем равные x, в конце - большие x. если не затруднит подскажите алгоритм решения этой задачи (а можно и код:)) заранее спасибо.
C++ Вывод иероглифов вместо русских символов ситуация такая вывожу строки на русском с помощью printf() в коде программы, перед этим пишу setlocale(LC_ALL, "") все нормально, но когда в процессе работы программы ввожу русские данные в консоле и также в программе вывожу их, то выводятся иероглифы... подскажите в чем проблема... подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
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.
 
Текущее время: 20:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru