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

Поиск:

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


Hacker
****


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

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



Есть класс, который генерит древовидную структуру используя обычные указателями. Структура довольно сложная и громоздкая, я боюсь где-то могу забыть прописать удаление указателя в деструкторе класса. Посему назрела мысль использовать "умников-стрелочников". Но насколько я понял пободные смартпоинтеры действуют по принципу - вышли из области видимости - сработал деструктор и сами удалились. Но у меня ситуация такая, в конструкторе создаются указатели, но при выходе из конструктора они должны остаться валидными и удалиться только в деструкторе моего класса. Как в таком случае применить смарт-поинтеры если их участь - подохнуть точно также как локальный объект созданный во временном стеке, теряется смысл ?


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


Эксперт
****


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

Репутация: 51
Всего: 70



Всё зависит от типа умного указателя. Далеко не все общедоступные реализации "умирают" при выходе из области видимости. Например boost::shared_ptr
PM MAIL WWW   Вверх
SABROG
Дата 14.4.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Уж очень не хочется использовать boost в своей программе. К тому же я так понимаю если указатель даже и shared, то компилятор сам ну ни как не определит в какой момент мне нужно удалять его, пока я вручную не задам аналог delete в нужном месте. А это опять же сводит на нет мою идею.


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


Терминатор
**


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

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



Раз указатели создаются в конструкторе, почему бы не объявить их как переменную класса в виде умного указателя?

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


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
vinter
Дата 14.4.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(SABROG @  14.4.2008,  19:11 Найти цитируемый пост)
Уж очень не хочется использовать boost в своей программе.

религия не позволяет? smile
Цитата(SABROG @  14.4.2008,  19:11 Найти цитируемый пост)
 К тому же я так понимаю если указатель даже и shared, то компилятор сам ну ни как не определит в какой момент мне нужно удалять его, пока я вручную не задам аналог delete в нужном месте.

не правильно понимаешь, когда кол-во ссылок на объект станет равным 0, тогда память будет освобождена.


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


Hacker
****


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

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



Цитата(Dreamer_0x01 @  14.4.2008,  18:15 Найти цитируемый пост)
Раз указатели создаются в конструкторе, почему бы не объявить их как переменную класса в виде умного указателя?

Нельзя, они динамические. Зависит от количества записей в базе данных. И содержит все эти указатели вектор, который является членом класса.

Цитата(vinter @  14.4.2008,  18:16 Найти цитируемый пост)
религия не позволяет?

Скорее не религия, а поговорка о пушках и воробьях.

Цитата(vinter @  14.4.2008,  18:16 Найти цитируемый пост)
не правильно понимаешь, когда кол-во ссылок на объект станет равным 0, тогда память будет освобождена.


А пример можно ?  smile

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


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


Explorer
****


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

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



Цитата(SABROG @  14.4.2008,  19:17 Найти цитируемый пост)
А пример можно ?  

создаешь shared_ptr и инициализируешь его обычным указателем, кол-во ссылок становится равным 1, при любом копировании( в том числе и инициализирующем) кол-во ссылок инкрементируется, при выходе любой копии за границу видимости, кол-во ссылок уменьшается на 1. так вот когда кол-во ссылок становится равным 0, вызывается delete для указателя который обернут в shared_ptr.


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


Hacker
****


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

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



Цитата(vinter @ 14.4.2008,  18:31)
Цитата(SABROG @  14.4.2008,  19:17 Найти цитируемый пост)
А пример можно ?  

создаешь shared_ptr и инициализируешь его обычным указателем, кол-во ссылок становится равным 1, при любом копировании( в том числе и инициализирующем) кол-во ссылок инкрементируется, при выходе любой копии за границу видимости, кол-во ссылок уменьшается на 1. так вот когда кол-во ссылок становится равным 0, вызывается delete для указателя который обернут в shared_ptr.

А как это сработает в таком виде:

//псевдо-код
Код

class A
{
public:
    list<shared_ptr *> pointers;
    A()
   {
         foreach(...)
         {
            pointers << shared_ptr(new Object);
         }
   }
}
otherClassConstructor()
{
// oA глобальный член otherClassConstructor
oA = new A;
}
metod1ofOtherClass()
{
... = oA.pointers[3];
}


Когда поинтеры убьются, когда убьется otherClass или вызовется delete для A ?


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


Эксперт
***


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

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



Цитата(SABROG @  14.4.2008,  18:17 Найти цитируемый пост)
Скорее не религия, а поговорка о пушках и воробьях.

Boost  Smart Pointer является совершенно самостоятельной библиотекой и даже не требует связывания на этапе линковки (вся функциональность содержится в заголовочных файлах)
Это к вопросу о пушках.
PM MAIL   Вверх
Fin
Дата 14.4.2008, 19:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Можно использовать ּSTL-овские контейнеры. Только в них не заносить сами указатели, а записи. Что то типа такого
Код

   vector<string> obj; 
   //...........
   obj.push_back("mathematics");
   obj.push_back("physics");
   obj.push_back("drafting");
   obj.push_back("chemistry");
   obj.push_back("resistent of stuff");


Тогда уже сам контейнер будет заботится об удалении записей.



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


Волкъ
***


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

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



Цитата(SABROG @  14.4.2008,  18:55 Найти цитируемый пост)
Но у меня ситуация такая, в конструкторе создаются указатели, но при выходе из конструктора они должны остаться валидными и удалиться только в деструкторе моего класса

Если ты создашь вектор auto_ptr'ов, то последующий занесенный auto_ptr будет копироатся из конструктора в список. А при копировании auto_ptr класс источник теряет ссылку. Так что выйдя з апределы конструктора ты ничего не потеряешь ибо вызовется деструктор у класса указатель из которого уже извлечен.
Т.е. при копировании из одного auto_ptr в другой ты не получишь 2 ссылки на auto_ptr. В таком случае только последний классс будет иметть реально ссылку которую прибьет в деструкторе. Короче кто последний влез, того и тапки.

Добавлено через 59 секунд
Fin, ага. И туда можно вогнать auto_ptr
PM   Вверх
vinter
Дата 14.4.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(SABROG @  14.4.2008,  19:40 Найти цитируемый пост)
А как это сработает в таком виде:

что то я не совсем понял твой псевдокод 


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


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(SABROG @  14.4.2008,  18:40 Найти цитируемый пост)
list<shared_ptr *> pointers;

не, shared_ptr - это уже указатель (по крайней мере, по смыслу), так что достаточно list<shared_ptr>

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


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


Эксперт
***


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

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



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

... в программе очень скоро начнутся проблемы smile
Подробности почему - читать в книгах зубров (Мейерс/Саттер)

Добавлено через 58 секунд
PS. собственно, ты дальше сам рассказал почему.
PM MAIL   Вверх
SABROG
Дата 14.4.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Mephisto @  14.4.2008,  19:36 Найти цитируемый пост)
Fin, ага. И туда можно вогнать auto_ptr 


Т.е. если вместо указателей запхнуть в контейнер auto_ptr'ы, то при удалении контейнера для каждого из объекта auto_ptr'a вызовется деструктор и освобождение памяти ?


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


Hacker
****


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

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



Похоже будет проще взять версию Fin'a (за что ему спасибо) чем лезть через терни к звездам.


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


Волкъ
***


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

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



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

Поправте меня если я не прав. Но насколько я знаю буст как раз и анонсирует то что все их классы поддерживают только стандарт С++.
PM   Вверх
vinter
Дата 14.4.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Mephisto @  14.4.2008,  23:32 Найти цитируемый пост)
Поправте меня если я не прав. Но насколько я знаю буст как раз и анонсирует то что все их классы поддерживают только стандарт С++.

буст все же стороння либа, то что содержится там не обязательно войдет в стандарт, но по крайней мере в boost tr1 содержится то что, должно быть в std::tr1


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


Эксперт
****


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

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



Цитата(Mephisto @ 14.4.2008,  22:32)
насколько я знаю буст как раз и анонсирует то что все их классы поддерживают только стандарт С++.

Сам то понял, что сказал?
Я тут недавно прочитал про то, зачем собственно этот буст был создан. Смысл такой, это что-то вроде бета-версии новых компонентов стандартной библиотеки С++. Далеко не все войдет в стандатр, но наиболее часто используемые вещи войдут.
PM   Вверх
SABROG
Дата 15.4.2008, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Как я и думал "через терни к звездам", не собирается буст 1.35.0:

Цитата

C:\boost_1_35_0>bjam ^
--build-dir="c:\boost" ^
--toolset=gcc stage
...
?? ??????? ????? C:\boost_1_35_0\stage\lib\boost_graph-mgw34-mt.lib
??????????? ??????:         1.
common.hard-link stage\lib\boost_iostreams-mgw34-mt.lib
?? ??????? ????? C:\boost_1_35_0\stage\lib\boost_iostreams-mgw34-mt.lib
??????????? ??????:         1.
common.hard-link stage\lib\boost_program_options-mgw34-mt.lib
?? ??????? ????? C:\boost_1_35_0\stage\lib\boost_program_options-mgw34-mt.lib
??????????? ??????:         1.
common.hard-link stage\lib\boost_python-mgw34-mt.lib
?? ??????? ????? C:\boost_1_35_0\stage\lib\boost_python-mgw34-mt.lib
??????????? ??????:         1.
common.hard-link stage\lib\libboost_regex-mgw34-mt.lib
?? ??????? ????? C:\boost_1_35_0\stage\lib\libboost_regex-mgw34-mt.lib
??????????? ??????:         1.
...failed updating 12 targets...
...skipped 8 targets...
...updated 292 targets...


Использую mingw 3.4.5. Хотелось бы мне знать, что скрывается за этими значками вопросов....

Это сообщение отредактировал(а) SABROG - 15.4.2008, 08:39


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

Добавлено через 2 минуты и 20 секунд
Цитата(SABROG @  15.4.2008,  08:35 Найти цитируемый пост)
Использую mingw 3.4.5. Хотелось бы мне знать, что скрывается за этими значками вопросов....


Цитата(SABROG @  15.4.2008,  08:35 Найти цитируемый пост)
...failed updating 12 targets...
...skipped 8 targets...
...updated 292 targets...


питон не установлен, boost::python поэтому не собирается, все остальное собралось =)
PM MAIL Skype GTalk   Вверх
SABROG
Дата 15.4.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Lazin @ 15.4.2008,  09:41)
SABROG, для shared_ptr ничего собирать не надо...
boost я использую на работе а у нас здесь к надежности софта очень высокие требования =)

Дело в том, что boost не имеет собранной утилиты BCP в исходниках, а она мне нужна, чтобы выцепить shared_ptr. Конечно, как вариант, можно поискать уже собранную, но я думал будет легче собрать буст "на будущее".

Вечером буду смотреть копать дальше как питон подключать, странно, что в мануале не дали ключи к bjam'у.


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


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(Fin @  14.4.2008,  21:43 Найти цитируемый пост)
Вот мой пример. Как то я для себя писал "умный указатель" который подсчитывает сам количество ссылок и если надо удаляет.

Замечательный пример того, что велосипедам лучше предпочесть нормальные широкоизвестные либы. Твой код просто ужасен: пользователь никак не может проверить указатель на равенство нулю, не может разыменовать и скопировать оператором присваивания константный указатель, и есть случай, когда программа из-за твоего указателя может попросту упасть. Ну и инкапсуляция тут тоже хромает (см. метод get). В топку такой класс.

Это сообщение отредактировал(а) UnrealMan - 15.4.2008, 13:13
PM MAIL   Вверх
Fin
Дата 15.4.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



UnrealMan, Может и в топку. Он в свое время отработал нормально и без притензий. Я никого не заставляю использовать этот класс, просто показал, что можно работать. Так что, как говорится в одной очень известной лицензии  AS IS.


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


Hacker
****


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

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



Цитата(Lazin @ 15.4.2008,  09:41)
питон не установлен, boost::python поэтому не собирается, все остальное собралось =)

Сам питон у меня стоит, вчера проверил. Может ему исходники нужны ?


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Ему нужно переменную окружения создать PYTHON_PATH вроде-бы...
Если тебе не нужен boost::python, то можно и не собирать, все остальное и так уже собрано
PM MAIL Skype GTalk   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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