Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умные указатели (smart pointers), auto_ptr и т.п. 
:(
    Опции темы
vinter
Дата 14.4.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Mephisto @  14.4.2008,  20:36 Найти цитируемый пост)
Если ты создашь вектор auto_ptr'ов

кстати вполне возможно, что этот не скомпилируется.


--------------------
Мой блог
PM MAIL WWW   Вверх
Mephisto
Дата 14.4.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Цитата(vinter @  14.4.2008,  21:23 Найти цитируемый пост)
кстати вполне возможно, что этот не скомпилируется. 

Кстати да, возможно. 
PM   Вверх
SABROG
Дата 14.4.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Так оно и есть:

Код

    std::vector<std::auto_ptr<int> > list;
    std::auto_ptr<int> var1(new int);
    list.push_back(var1);


Цитата

C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_construct.h: In function `void std::_Construct(_T1*, const _T2&) [with _T1 = std::auto_ptr<int>, _T2 = std::auto_ptr<int>]':
C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_vector.h:560:   instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::auto_ptr<int>, _Alloc = std::allocator<std::auto_ptr<int> >]'
src\Dict.cpp:52:   instantiated from here
C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_construct.h:81: error: passing `const std::auto_ptr<int>' as `this' argument of `std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = int, _Tp = int]' discards qualifiers
C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/vector.tcc: In member function `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = std::auto_ptr<int>, _Alloc = std::allocator<std::auto_ptr<int> >]':
C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_vector.h:564:   instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::auto_ptr<int>, _Alloc = std::allocator<std::auto_ptr<int> >]'
src\Dict.cpp:52:   instantiated from here
C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/vector.tcc:234: error: passing `const std::auto_ptr<int>' as `this' argument of `std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = int, _Tp = int]' discards qualifiers


А с shared_ptr тоже самое будет ?

Это сообщение отредактировал(а) SABROG - 14.4.2008, 21:16


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 14.4.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



SABROG, auto_ptr нельзя использовать в контейнерах. Просто работа с контейнерами подразумевает нормальную логику работы оператора присваивания и конструктора копирования. А у auto_ptr эти функции являются перемещающими. Другими словами, auto_ptr надо использовать при возврате функцией ссылки на объект, чтобы он сам удалился когда будет не нужен, а также для хранения указателей на динамически конструируемые поля классов.
У boost::shared_ptr логика копирования классическая. Поэтому его можно хранить в контейнерах.
PM   Вверх
SABROG
Дата 14.4.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Что-то мне подсказывает, что выцепить shared_ptr отдельно от буста будет сложно...

//shared_ptr.hpp
Код

#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
#define BOOST_SHARED_PTR_HPP_INCLUDED

//
//  shared_ptr.hpp
//
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
//  Copyright (c) 2001-2007 Peter Dimov
//
//  Distributed under the Boost Software License, Version 1.0. (See
//  accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)
//
//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
//

#include <boost/config.hpp>   // for broken compiler workarounds

#if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
#include <boost/detail/shared_ptr_nmt.hpp>
#else

#include <memory>               // for std::auto_ptr

#include <boost/assert.hpp>
#include <boost/checked_delete.hpp>
#include <boost/throw_exception.hpp>
#include <boost/detail/shared_count.hpp>
#include <boost/detail/workaround.hpp>

#include <algorithm>            // for std::swap
#include <functional>           // for std::less
#include <typeinfo>             // for std::bad_cast

#if !defined(BOOST_NO_IOSTREAM)
#if !defined(BOOST_NO_IOSFWD)
#include <iosfwd>               // for std::basic_ostream
#else
#include <ostream>
#endif
#endif

#ifdef BOOST_MSVC  // moved here to work around VC++ compiler crash
# pragma warning(push)
# pragma warning(disable:4284) // odd return type for operator->
#endif




--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Fin
Дата 14.4.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Вот мой пример. Как то я для себя писал "умный указатель" который подсчитывает сам количество ссылок и если надо удаляет.
Код

#include <list>
#include <iostream>
#include <assert.h>

using namespace std;

template <class T>
class smart_ptr
{
   private:
      struct Tptr
      {
         int count;
         T *ptr;
         Tptr()
         {
            count=1;
            ptr=NULL;
         }
      };
      
      Tptr * ptr;
      
      void delete_ptr()
      {
         if (ptr != NULL) 
         {
            ptr->count--;
            if (ptr->count == 0) 
            {
               delete ptr->ptr;
               delete ptr;
            }
            ptr=NULL;
         }
      };
      
      void new_ptr(T *t)
      { 
         delete_ptr();
         ptr=new Tptr;
         if (ptr != NULL) ptr->ptr=t;
      };
      
      void inc_ptr(Tptr *t)
      {
         delete_ptr();
         ptr=t;
         if (ptr != NULL) ptr->count++;
      }
      
   public:
      smart_ptr() {ptr=NULL;};
      smart_ptr(T *t)  
      {
         ptr=NULL;
         new_ptr(t);
      };
      
      smart_ptr(const smart_ptr<T> & cl)
      {
         ptr=NULL;
         inc_ptr(cl.ptr);
      };
      
      ~smart_ptr()
      {
         delete_ptr();
      };
      
      smart_ptr & operator = (T *t)
      {
         if (t != NULL)
         {
            new_ptr(t);
         }
         return *this;
      };
      
      smart_ptr & operator = (smart_ptr<T> & cl)
      {
          inc_ptr(cl.ptr);
          return *this;
      };
      
      T& operator *()
      {
         assert(ptr != NULL);
         assert(ptr->ptr != NULL);
         return *ptr->ptr;
         
      };
      
      T *operator ->()
      {
         assert(ptr != NULL);
         assert(ptr->ptr != NULL);
         return ptr->ptr;         
      };
      
      T *& get()
      {
         assert(ptr != NULL);
         assert(ptr->ptr != NULL);
         return ptr->ptr;         
      };
      
};


class prob
{
public:
    prob(int i): _i(i) {cout << "Constructor: " << _i << endl;};
    prob() {_i=0; cout << "Default constructor: "<< _i << endl;};
    prob(const prob &pr) {_i=pr._i; cout << "Copy constructor: "<< _i << endl;};
    ~prob() {cout << "Destructor: " << _i << endl;};
private:
    int _i;
};


typedef smart_ptr<prob > probptr;
typedef list<probptr> ProbList;

int main()
{
    ProbList problist;
    for (int i=0; i<5; ++i) problist.push_back(probptr(new prob(i)));
    return 0;
}

получаем 
Цитата

Constructor: 0
Constructor: 1
Constructor: 2
Constructor: 3
Constructor: 4
Destructor: 0
Destructor: 1
Destructor: 2
Destructor: 3
Destructor: 4


Это сообщение отредактировал(а) Fin - 14.4.2008, 21:45


--------------------
Пролетал мимо.
PM MAIL   Вверх
Rififi
Дата 14.4.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Цитата(SABROG @  14.4.2008,  21:38 Найти цитируемый пост)
Что-то мне подсказывает, что выцепить shared_ptr отдельно от буста будет сложно...

Это будет сложно только до того момента, пока ты не познакомишься с Boost BCP Utility
PM MAIL   Вверх
bsa
Дата 14.4.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



SABROG, а почему ты так боишься самого буста? Установи его и используй. Какие проблемы? Тем более, что вроде как этот shared_ptr в стандарт С++ должен войти, как и некоторые другие вещи из буста.
PM   Вверх
SABROG
Дата 14.4.2008, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Rififi @ 14.4.2008,  21:47)
Цитата(SABROG @  14.4.2008,  21:38 Найти цитируемый пост)
Что-то мне подсказывает, что выцепить shared_ptr отдельно от буста будет сложно...

Это будет сложно только до того момента, пока ты не познакомишься с Boost BCP Utility

Уже познакомился, спс. Просто я скачал исходники через SVN, а этот BCP надо собирать...

Цитата(bsa @  14.4.2008,  21:48 Найти цитируемый пост)
SABROG, а почему ты так боишься самого буста? Установи его и используй. Какие проблемы? Тем более, что вроде как этот shared_ptr в стандарт С++ должен войти, как и некоторые другие вещи из буста. 


А потому, что программа кроссплатформенная и возможно я буду выкладывать ее исходники и мне бы не хотелось заставлять других программистов устанавливать boost только ради того, что я использую shared_ptr...

Это сообщение отредактировал(а) SABROG - 14.4.2008, 21:51


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 14.4.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(SABROG @ 14.4.2008,  21:49)
Просто я скачал исходники через SVN

Зачем, если не секрет? Чем тебя стабильная версия не устроила?
PM   Вверх
Rififi
Дата 14.4.2008, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



bsa
Иногда в в trunk'е появляются различные полезные классы/библиотеки которых долго ждать в релизе (как например это было с circular_buffer etc), а учитывая, насколько может затянуться релиз...
PM MAIL   Вверх
bsa
Дата 14.4.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Rififi @ 14.4.2008,  21:55)
bsa
Иногда в в trunk'е появляются различные полезные классы/библиотеки которых долго ждать в релизе (как например это было с circular_buffer etc), а учитывая, насколько может затянуться релиз...

Тут речь идет о shared_ptr, которому уже 100 лет в обед.  smile 
PM   Вверх
SABROG
Дата 14.4.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(bsa @ 14.4.2008,  21:59)
Цитата(Rififi @ 14.4.2008,  21:55)
bsa
Иногда в в trunk'е появляются различные полезные классы/библиотеки которых долго ждать в релизе (как например это было с circular_buffer etc), а учитывая, насколько может затянуться релиз...

Тут речь идет о shared_ptr, которому уже 100 лет в обед.  smile

Я руководствовался такой логикой, раз SVN значит исходники, а раз исходники, значит можно выдрать shared_ptr и желательно последней версии, если он вообще менялся smile


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Rififi
Дата 14.4.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



bsa, ну если про shared_ptr, тогда, наверное, преимуществ нет. А вообще, вотЪ smile

Это сообщение отредактировал(а) Rififi - 14.4.2008, 22:04
PM MAIL   Вверх
bsa
Дата 14.4.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



SABROG, буст в исходниках и поставляется. Поэтому, когда хочется по быстрее установить гимор возникает - компилится сволочь долго (не всем только shared_ptr нужен)!
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.