Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Умные указатели?  (Прочитано 9600 раз)
0 Пользователей и 1 Гость смотрят эту тему.
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« : 17-07-2006 07:55 » 

Всем привет!

Вопрос может быть немного глупый, но всеже.

Зачем нужны умные указатели, а точнее когда их следует применять.
Записан

С уважением, asker
LP
Помогающий

ru
Offline Offline

« Ответ #1 : 17-07-2006 09:07 » 

Цитата
Зачем нужны умные указатели
Чтобы не было утечек памяти. Улыбаюсь

Цитата
а точнее когда их следует применять
Когда хочешь, чтобы не было утечек памяти. Улыбаюсь
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 17-07-2006 12:52 » 

Умные указатели - это объекты, в которых хранится указатель на настоящий объект и счётчик числа обращений к объкту, деструктор для настоящего объекта не вызывается извне, а только внутри SP, когда счётчик обращений к объекту равен 0, это очень важно!. Например у тебя есть список указателей на объекты. Ты  используешь копию указателя на один объект где-нибудь ещё. Потом очищаешь список, удаляя при этом объекты, а "где-нибудь ещё" все ещё хранит указатель. При доступе на него происходит сбой проги, тк объект был удалён при очистке списка. Если же у тебя smart pointers, то такого не произойдёт, тк при создании копии указателя внутренний счётчик увеличится на 1. Те будет равен двум - 1 для списка, и ещё 1 для "где-нибудь ещё". Теперь даже если ты удалишь объект из списка, внутренний счётчик уменьшится на 1 и станет равным 1, те "где-нибудь ещё" может продолжать работать с объектом. После того как он станет ненужным "где-нибудь ещё" освобождает память от него и счётчик становится равным 0, в этот момент вызывается деструктор для оригинального объекта.
На самом деле использование SP только расхолаживает, при достаточной дисциплине можно превосходно обходится и без них. Тк найти ошибку с ними гораздо сложней. Распространённая ошибка - использование мешанины SP и простых указателей, когда деструктор оригинального объекта вызывается явно, без SP. Тогда концов не найдёшь.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-07-2006 06:53 » 

LP, Джон спасибо за ответы.

Буду думать, изучать и т.д дальше >>
Записан

С уважением, asker
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 19-07-2006 17:33 » 

В дополнение к посту Джона.
не следует использовать контейнеры для хранения умных указателей если ты не знаешь как ТОЧНО именно ЭТА реализация будет себя вести при копировании. std::auto_ptr лучше не использовать это точно а вот boost::shared_ptr будет вести себя в контейнере адекватно но по причине подсчета ссылок чего не делает auto_ptr

что же касается расхолаживания у в своей рабое активно применю и auto_ptr и shared_ptr(в зависимости от разных нюансов) должен заметить не разу не было ошибок связанных со SP

правда используются они у нас в основном для создание классов реализующих интерфейс и создаются в конструкторе интерфеса а удаляются в деструкторе интерфейса(не явно)
Код:
// File: interface.hpp

class impl;

struct interface{
boost::shared_ptr<impl> pImpl_;
interface();
void use();
}

// File: impl.cpp

#include "interface.hpp"

interface::interface():pImpl_(new impl()){};

void interface::use()
{
  impl->use();
}


Записан

Странно всё это....
nop
Гость
« Ответ #5 : 21-07-2006 05:27 » 

Всем привет!

Вопрос может быть немного глупый, но всеже.

Зачем нужны умные указатели, а точнее когда их следует применять.

Ко всему вышесказанному могу добавить что использование (специальных) умных указателей позоляет абстрагироваться от физического места расположения объекта: он может быть в файле, БД, где угодно. но при получении доступа к нему может происходить фактическая загрузка в память, кеширование и т.п.

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines