Почему скользящие указатели в boost

Какова цель указателя с областью? Насколько я понимаю, скопированный указатель управляет памятью внутри блока кода. Если я хочу объявить переменную внутри блока, я могу просто объявить ее в стеке и не беспокоиться об очистке.

Ответы

Ответ 1

Нет, если он имеет динамический размер или тип. Кроме того, облачные указатели можно поменять местами, а в С++ 11 unique_ptr можно перемещать, поэтому они не строго ограничены.

Ответ 2

В отличие от данных на основе стека, scoped_ptr имеет элемент reset(), другими словами, вы можете построить/разрушить ваше сердечное содержимое. При этом вы можете использовать нулевой указатель (технически operator unspecified-bool-type) в качестве флага, указывающего, есть ли построенный объект в любой момент времени. Он также позволяет вам последовательно строить/уничтожать независимо от области переменных, если это необходимо.

Также учтите, что вы можете объявить scoped_ptr как член класса, а не только как стекную переменную. docs предлагают использовать scoped_ptr для реализации идиомы handle/body (чтобы скрыть детали реализации класса).

Наконец, чтобы уточнить точку DeadMG "Не для динамического типа", вы можете использовать scoped_ptr для реализации операции полиморфной:/p >

{
scoped_ptr<Base> a( mode ? new DerivedA : new DerivedB );
a->polymorphic_function();
}

Невозможно сделать это с помощью простого распределения на основе стека.


Также см. здесь: С++ 0x unique_ptr заменяет scoped_ptr на владение?

Ответ 3

Дело в том, что вы можете создавать и очищать указатель в пределах определенной лексической области. Это может быть полезно в различных ситуациях, и это гарантирует, что у вас нет утечек памяти, забыв delete, если вы должны явно использовать new, что не рекомендуется.

Вы должны помнить, что boost::scoped_ptr не копируется, и поэтому он полностью владеет ресурсом в течение всего срока его службы. Это также делает его более безопасным, чем boost::shared_ptr, поскольку он позволяет избежать копирования ресурса или случайно его использовать.

{ //Some Scope

  boost::scoped_ptr<int> i_ptr;
  // do something with pointer

} // leave scope, pointer is cleaned up

Ответ 4

обычно стеки потоков имеют пределы памяти (см. раздел "стекирование потоков" ).

также иногда указатель мог быть передан вам извне и должен быть удален в этой области (например, если выбрано исключение, любой вызов на удаление ниже этой строки не будет выполнен). Поэтому вам нужно как-то автомагически очистить указатель

void foo(Object*obj)
{
    //this will ensure that object gets cleaned up even if doFoo() throws an exception
    boost::scoped_ptr<Object> objCleaner(obj);
    obj->doFoo();
}