![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Что такое smart point?? И как его использовать? Зачем они нужны? Какие различия между обычними указателями?
Если можно то напишите плз пример. Заранее спасибо. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Smart pointer.
Это такие классы, которые реализуют идиому RAII. Идея в том, что когда ты запрашиваешь некоторый ресурс у системы(в данном случае память), ты передаёшь его во владение смарт-поинтеру. В тривиальных случаях(std::auto_ptr), когда уничтожится смарт-поинтер, тогда и память освободится. Бывают смарт-поинтеры с подсчётом ссылок(boost::shared_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 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Почитай книгу "Библиотека программиста" Элджера.
От себя могу добавить: смарт поинтер это класс семантичесски эквивалентный простому указателю, но способный на дополнительные действия. Его можно использовать для чего угодно, например обнулять указатель после удаления, но обычно всё таки для работы с памятью. К примеру если какая либо ф-я создаёт объект и возвращает указатель на него ( Foo* makeFoo() {return new Foo;} ), то в принципе возможна ситуация, когда ф-я будет вызвана так: makeFoo();. В этом случае произойдет утечка памяти. А если в место указателя возвращать std::auto_ptr то объект будет автоматически удален. Еще можно сделать к примеру, так, что с каким-то классом можно работать только через смарт поинтер. |
|||
|
||||
dizzy1984 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 3 Всего: 25 |
Кроме того, умные указатели удобно использовать в качестве полей класса.
Преимущества те же, что и в описанном archimed7592 примере : 1. Очистка памяти в случае срабатывания исключения (в нашем случае в конструкторе) 2. Отсутствие необходимости освобожения памяти в деструкторе. Правда придется переписать определения конструктора копирования и оператора присваивания. Единственное что хотелось бы отметить, это то, что в теле функции лучше было бы написать auto_ptr с модификатором const. т.е
Ввиду теоретической возможности следующих ситуаций
Несмотря на семантику инициализации ptr2, в реальности происходит передача владельца от ptr к ptr2, что приводит к "бесполезности" ptr.
Что кроме потери владельца приведет еще и к освобождению памяти после вызова SomeFunc. По идее при любой работе с динамической памятью обычные указатели следует замещать смарт поинтерами, т.к они делают код более защищенным от утечек. Это сообщение отредактировал(а) dizzy1984 - 20.7.2007, 13:50 |
||||||||
|
|||||||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Как, собственно, и в случае использования dumb-pointer'ов ![]() -------------------- 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 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
вот там http://www.kalinin.ru/programming/cpp/27_07_00.shtml мне очень понравились некоторые замечания, они не часто встречаются (про завешивание компиляторов (хотя современные распознают замыкания...))....
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |