Вопрос по scoped-ptr, boost, c++ – Почему указатели в надстройке

10

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

Ваш Ответ

4   ответа
2

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

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

{ //Some Scope

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

} // leave scope, pointer is cleaned up
1

оков).

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

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();
}
Я могу объявить указатель на стек, и он будет автоматически очищен, когда функция выйдет из области видимости, либо успешно, либо через исключение. Правильный? Jimm
4

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

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

Наконец, для уточнения точки DeadMG «Нет, если она имеет динамический тип», вы можете использовать scoped_ptr для реализацииполиморфный операция:

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

Это действительно невозможно сделать сsimple стековое распределение.

Также смотрите здесь:C ++ 0x unique_ptr заменяет scoped_ptr, вступая во владение?

Или просто использовать посетителя.
Я не вижу, как получить доступ к производному классу через интерфейс базового класса. Может быть, я что-то упустил.
Почему ты так не думаешь?
@GManNickG: я не думаю, что boost :: option обеспечивает хорошую замену полиморфизму через scoped_ptr - что интересно. Спасибо!
boost::variant<DerivedA, DerivedB>. :)
4

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

Или, если он слишком большой.
Что вы подразумеваете под динамическим размером или типом? Jimm
@BenVoigt: Но это предусмотрено и может быть использовано.
Здесь & APOS; san old thread обсуждая почемуswap стало требованием (в основном такscoped_ptr может использоваться как член копируемого класса).
За исключением того, что & quot; Основная причина использованияscoped_ptr скорее, чемauto_ptr означает, что читатели вашего кода знают, что вы намереваетесь "инициализация ресурса - это инициализация"; применяется только для текущей области и не имеет намерения передавать право собственности "... похожеswap не предназначено для использования.

Похожие вопросы