Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Smart point |
Автор: Sergio 19.7.2007, 18:55 |
Что такое smart point?? И как его использовать? Зачем они нужны? Какие различия между обычними указателями? Если можно то напишите плз пример. Заранее спасибо. |
Автор: zkv 19.7.2007, 19:03 |
http://ootips.org/yonat/4dev/smart-pointers.html? Офф: "Smart point" - "умная точка" (англ.) ![]() |
Автор: archimed7592 19.7.2007, 19:09 | ||
Smart pointer. Это такие классы, которые реализуют идиому RAII. Идея в том, что когда ты запрашиваешь некоторый ресурс у системы(в данном случае память), ты передаёшь его во владение смарт-поинтеру. В тривиальных случаях(std::auto_ptr), когда уничтожится смарт-поинтер, тогда и память освободится. Бывают смарт-поинтеры с подсчётом ссылок(boost::shared_ptr).
К слову, в случае выброса исключения, память тоже будет освобождена. Как и в случае, если возврат из ф-ции произойдёт в её середине(по какому-либо условию). |
Автор: Lazin 20.7.2007, 07:49 |
Почитай книгу "Библиотека программиста" Элджера. От себя могу добавить: смарт поинтер это класс семантичесски эквивалентный простому указателю, но способный на дополнительные действия. Его можно использовать для чего угодно, например обнулять указатель после удаления, но обычно всё таки для работы с памятью. К примеру если какая либо ф-я создаёт объект и возвращает указатель на него ( Foo* makeFoo() {return new Foo;} ), то в принципе возможна ситуация, когда ф-я будет вызвана так: makeFoo();. В этом случае произойдет утечка памяти. А если в место указателя возвращать std::auto_ptr то объект будет автоматически удален. Еще можно сделать к примеру, так, что с каким-то классом можно работать только через смарт поинтер. |
Автор: dizzy1984 20.7.2007, 13:48 | ||||||||
Кроме того, умные указатели удобно использовать в качестве полей класса.
Преимущества те же, что и в описанном archimed7592 примере : 1. Очистка памяти в случае срабатывания исключения (в нашем случае в конструкторе) 2. Отсутствие необходимости освобожения памяти в деструкторе. Правда придется переписать определения конструктора копирования и оператора присваивания. Единственное что хотелось бы отметить, это то, что в теле функции лучше было бы написать auto_ptr с модификатором const. т.е
Ввиду теоретической возможности следующих ситуаций
Несмотря на семантику инициализации ptr2, в реальности происходит передача владельца от ptr к ptr2, что приводит к "бесполезности" ptr.
Что кроме потери владельца приведет еще и к освобождению памяти после вызова SomeFunc. По идее при любой работе с динамической памятью обычные указатели следует замещать смарт поинтерами, т.к они делают код более защищенным от утечек. |
Автор: jonie 21.7.2007, 22:05 |
вот там http://www.kalinin.ru/programming/cpp/27_07_00.shtml мне очень понравились некоторые замечания, они не часто встречаются (про завешивание компиляторов (хотя современные распознают замыкания...)).... |