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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Smart point, что это такое и с чем его едят? 
:(
    Опции темы
Sergio
  Дата 19.7.2007, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

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



Что такое smart point?? И как его использовать? Зачем они нужны? Какие различия между обычними указателями?
Если можно то напишите плз пример.
Заранее спасибо.
PM MAIL ICQ   Вверх
zkv
Дата 19.7.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



smart-pointer?

Офф: "Smart point" - "умная точка" (англ.)  smile
PM MAIL   Вверх
archimed7592
Дата 19.7.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Smart pointer.
Это такие классы, которые реализуют идиому RAII.
Идея в том, что когда ты запрашиваешь некоторый ресурс у системы(в данном случае память), ты передаёшь его во владение смарт-поинтеру. В тривиальных случаях(std::auto_ptr), когда уничтожится смарт-поинтер, тогда и память освободится. Бывают смарт-поинтеры с подсчётом ссылок(boost::shared_ptr).
Код

void myfunc()
{
    std::auto_ptr< MyClass > ptr(new MyClass(...)); // выделяем память.
    // ...
    return; // здесь ptr уничтожается и память освобождается.
}

К слову, в случае выброса исключения, память тоже будет освобождена. Как и в случае, если возврат из ф-ции произойдёт в её середине(по какому-либо условию).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Lazin
Дата 20.7.2007, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Почитай книгу "Библиотека программиста" Элджера. 
От себя могу добавить: смарт поинтер это класс семантичесски эквивалентный простому указателю, но способный на дополнительные действия. Его можно использовать для чего угодно, например обнулять указатель после удаления, но обычно всё таки для работы с памятью. К примеру если какая либо ф-я создаёт объект и возвращает указатель на него ( Foo* makeFoo() {return new Foo;} ), то в принципе возможна ситуация, когда ф-я будет вызвана так: makeFoo();. В этом случае произойдет утечка памяти. А если в место указателя возвращать std::auto_ptr то объект будет автоматически удален. Еще можно сделать к примеру, так, что с каким-то классом можно работать только через смарт поинтер.
PM MAIL Skype GTalk   Вверх
dizzy1984
Дата 20.7.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

class Class
{
   const std::auto_prt<MyClass> var1;
   const std::auto_prt<MyClass> var2;
}

Преимущества те же, что и в описанном archimed7592 примере : 
1. Очистка памяти в случае срабатывания исключения (в нашем случае в конструкторе)
2. Отсутствие необходимости освобожения памяти в деструкторе.
Правда придется переписать определения конструктора копирования и оператора присваивания.
Единственное что хотелось бы отметить, это то, что в теле функции лучше было бы написать auto_ptr с модификатором const.
т.е
Код

const std::auto_ptr< MyClass > ptr(new MyClass(...));

Ввиду теоретической возможности следующих ситуаций
Код

std::auto_ptr< MyClass > ptr(new MyClass(...));
std::auto_ptr< MyClass > ptr2;
ptr2 = ptr;

Несмотря на семантику инициализации ptr2, в реальности происходит передача владельца от ptr к ptr2, что приводит к "бесполезности" ptr.

Код

void SomeFunc(std::auto_ptr<MyClass> p)
{
return;
}
...
{
    std::auto_ptr< MyClass > ptr(new MyClass(...));
    SomeFunc(ptr);
}

Что кроме потери владельца приведет еще и к освобождению памяти после вызова SomeFunc.

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

Это сообщение отредактировал(а) dizzy1984 - 20.7.2007, 13:50
PM MAIL   Вверх
archimed7592
Дата 20.7.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Цитата(dizzy1984 @  20.7.2007,  13:48 Найти цитируемый пост)
Правда придется переписать определения конструктора копирования и оператора присваивания.

Как, собственно, и в случае использования dumb-pointer'ов smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
jonie
Дата 21.7.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 15
Всего: 118



вот там http://www.kalinin.ru/programming/cpp/27_07_00.shtml мне очень понравились некоторые замечания, они не часто встречаются (про завешивание компиляторов (хотя современные распознают замыкания...))....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0729 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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