Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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" - "умная точка" (англ.)  smile

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

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

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

Автор: Lazin 20.7.2007, 07:49
Почитай книгу "Библиотека программиста" Элджера. 
От себя могу добавить: смарт поинтер это класс семантичесски эквивалентный простому указателю, но способный на дополнительные действия. Его можно использовать для чего угодно, например обнулять указатель после удаления, но обычно всё таки для работы с памятью. К примеру если какая либо ф-я создаёт объект и возвращает указатель на него ( Foo* makeFoo() {return new Foo;} ), то в принципе возможна ситуация, когда ф-я будет вызвана так: makeFoo();. В этом случае произойдет утечка памяти. А если в место указателя возвращать std::auto_ptr то объект будет автоматически удален. Еще можно сделать к примеру, так, что с каким-то классом можно работать только через смарт поинтер.

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

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.

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)