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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смартпоинтеры в STL. 
:(
    Опции темы
NightmareZ
Дата 18.3.2010, 04:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



О чём думали дизайнеры STL, создавая в нём единственный тип смартпоинтеров, который при том (что он единственный) нельзя использовать в контейнерах?

Мне нужен полиморфизм для объектов в коллекции (например, в векторе). Просвятите неразумного шарписта, как в C++ (без всяких бустов и нового Стандарта) это сделать? Не указатели же на базовый класс хранить?

Код
#include <vector> 
#include <iostream> 
 
class Base 

public: 
   virtual void Do() = 0; 
}; 
 
class Child1 : public Base 

public: 
   void Do() { std::cout << "Child 1" << std::endl; } 
}; 
 
class Child2 : public Base 

public: 
   void Do() { std::cout << "Child 2" << std::endl; } 
}; 
 
void func() 

   std::vector<Base*> vec; 
   vec.push_back(new Child1()); 
   vec.push_back(new Child2()); 
 
   // что-то делаем... 
 
   throw 1; // неожиданно 
 
   for (std::vector<Base*>::iterator it = vec.begin(); it != vec.end(); it++) 
      delete *it; 
}



--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
NightmareZ
Дата 18.3.2010, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



В идеале я бы хотел вот такого, но из стандартной поставки:

Код
void func()  
{  
   std::vector<std::tr1::shared_ptr<Base>> vec;  
   vec.push_back(std::tr1::shared_ptr<Base>(new Child1()));  
   vec.push_back(std::tr1::shared_ptr<Base>(new Child2()));  
  
   // что-то делаем...  
  
   throw 1; // неожиданно и пофиг 
  
   // а этого не нужно 
   // for (std::vector<Base*>::iterator it = vec.begin(); it != vec.end(); it++)  
   //   delete *it;  
}



--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
azesmcar
Дата 18.3.2010, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(NightmareZ @  18.3.2010,  04:27 Найти цитируемый пост)
Просвятите неразумного шарписта, как в C++ (без всяких бустов и нового Стандарта) это сделать? 

Никак, в STL нет smartpointer-ов. Непонятно в чем вопрос, если ты сам это знаешь, напиши свой shared_ptr, но я бы использовал boost.
PM   Вверх
borisbn
Дата 18.3.2010, 07:29 (ссылка) |   (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 21
Всего: 135



И в любом случае в Base нужно определить виртуальный деструктор 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NightmareZ
Дата 18.3.2010, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



Цитата(borisbn @  18.3.2010,  07:29 Найти цитируемый пост)
И в любом случае в Base нужно определить виртуальный деструктор 


Виртуальный деструктор тут нафик не нужен.

Добавлено через 2 минуты и 7 секунд
Цитата(azesmcar @  18.3.2010,  06:37 Найти цитируемый пост)
Никак, в STL нет smartpointer-ов.

Как нет. А auto_ptr?

Цитата(azesmcar @  18.3.2010,  06:37 Найти цитируемый пост)
Непонятно в чем вопрос, если ты сам это знаешь, напиши свой shared_ptr, но я бы использовал boost.

Вопрос в том, как люди обходятся? Пишут своё? Почему нет в стандартной библиотеке ничего подходящего?


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
rgsoftware
Дата 18.3.2010, 08:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Вопрос в том, как люди обходятся? Пишут своё? Почему нет в стандартной библиотеке ничего подходящего? 


Ну, потому что Стандартная библиотека в нынешнем виде -- это фиксация на бумаге 1998 года, тогда ещё народ, видимо, коллективно не созрел до смартпоинтеров в коллекциях.
А потом дописали буст... Если по каким-то причинам буст не устраивает, надо просто вырезать кусок, ответственный за shared_ptr, и использовать у себя с чистой совестью smile
PM MAIL   Вверх
azesmcar
Дата 18.3.2010, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(NightmareZ @  18.3.2010,  08:06 Найти цитируемый пост)
Как нет. А auto_ptr?

имелось ввиду тех, о которых ты спрашивал. Про auto_ptr ты сам написал, и сам же сказал почему он не подходит.

Цитата(NightmareZ @  18.3.2010,  04:27 Найти цитируемый пост)
О чём думали дизайнеры STL, создавая в нём единственный тип смартпоинтеров, который при том (что он единственный) нельзя использовать в контейнерах?


Цитата(NightmareZ @  18.3.2010,  08:06 Найти цитируемый пост)
Вопрос в том, как люди обходятся? Пишут своё? Почему нет в стандартной библиотеке ничего подходящего? 

нет, почему же..люди уже давно используют буст smile
boost смело можно считать стандартной библиотекой.
STL писали давно, в нее много чего не вошло.

Цитата(borisbn @  18.3.2010,  07:29 Найти цитируемый пост)
И в любом случае в Base нужно определить виртуальный деструктор  

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

Добавлено через 13 минут и 13 секунд
Цитата(borisbn @  18.3.2010,  07:29 Найти цитируемый пост)
И в любом случае в Base нужно определить виртуальный деструктор  

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

Это сообщение отредактировал(а) azesmcar - 18.3.2010, 08:46
PM   Вверх
bsa
Дата 18.3.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NightmareZ @  18.3.2010,  08:06 Найти цитируемый пост)
Виртуальный деструктор тут нафик не нужен.
Ты в этом уверен на 100%? Потому что обычно, когда есть виртуальные методы, виртуальный деструктор нужен. Другими словами, если потомки класса Base имеют хоть один атрибут, то без виртуального диструктора твой первый пример приведет к утечкам памяти.

Напиши свой вариант shared_ptr внутри #ifdef/#else/#endif, что позволит использовать твой код юзая смартпоинтеры нового стандарта лишь задефайнив определенный макрос.
PM   Вверх
azesmcar
Дата 18.3.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(bsa @  18.3.2010,  11:30 Найти цитируемый пост)
Ты в этом уверен на 100%? Потому что обычно, когда есть виртуальные методы, виртуальный деструктор нужен. Другими словами, если потомки класса Base имеют хоть один атрибут, то без виртуального диструктора твой первый пример приведет к утечкам памяти.

Мне пора в отпуск..
Цитата(azesmcar @  18.3.2010,  08:39 Найти цитируемый пост)
подожди, чего-то не так понял (я думал речь о наследниках)..так он же виртуальный.

я функцию Do за деструктор принял smile 

наконец понял о чем речь.

Цитата(bsa @  18.3.2010,  11:30 Найти цитируемый пост)
обычно, когда есть виртуальные методы, виртуальный деструктор нужен

можно сказать он нужен всегда (когда есть виртуальные методы), а тут тем более, иначе в строке
Код

for (std::vector<Base*>::iterator it = vec.begin(); it != vec.end(); it++) 
      delete *it; 

будет UB.
gcc даже warning выдает на классы, у которых есть виртуальные методы и не виртуальный деструктор.

Это сообщение отредактировал(а) azesmcar - 18.3.2010, 11:36
PM   Вверх
djamshud
Дата 18.3.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Сишарперы настолько суровы, что не в состоянии прикрутить к своему проекту любой готовый sharedptr, не говоря уже о том, что бы написать его самому за десять минут? Нет его в STL, сами написали, так чего сопли по форумам размазывать?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
NightmareZ
Дата 18.3.2010, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



Цитата(bsa @  18.3.2010,  11:30 Найти цитируемый пост)
Ты в этом уверен на 100%? Потому что обычно, когда есть виртуальные методы, виртуальный деструктор нужен. Другими словами, если потомки класса Base имеют хоть один атрибут, то без виртуального диструктора твой первый пример приведет к утечкам памяти.


Уверен. Что за атрибут? Где тут утечка?


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
azesmcar
Дата 18.3.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(NightmareZ @  18.3.2010,  13:20 Найти цитируемый пост)
Что за атрибут? 

имелся ввиду любой атрибут класса, которого в примере нет, но в реальной жизни может и быть.

Цитата(NightmareZ @  18.3.2010,  13:20 Найти цитируемый пост)
Где тут утечка? 

скорее всего это утечка, так как не вызовется деструктор наследника, но стандарт не гарантирует определенного поведения, при удалении объекта класса, не имеющего виртуального деструктора через указатель базового.
PM   Вверх
bsa
Дата 18.3.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NightmareZ @  18.3.2010,  13:20 Найти цитируемый пост)
Уверен. Что за атрибут? Где тут утечка? 
Если мы рассматриваем конкретно тот пример, который иллюстрирует проблему, а в реальной программе у тебя есть виртуальный деструктор, то нет проблем. Считай, это напоминание.

PM   Вверх
JackYF
Дата 18.3.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Как тут уже сказали, есть буст и (когда-нибудь "релизнется" же он smile) C++0x, в STL которого есть тот самый бустовский умный указатель.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
GoldFinch
Дата 18.3.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 6
Всего: 26



JackYF, в следующем году релизнется:
http://herbsutter.wordpress.com/2010/03/13...ndards-meeting/
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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