Как использовать Интеллектуальные указатели C++?

Я использовал C++ в течение некоторого времени теперь, и я все еще не чувствую себя очень комфортно в отношении использования интеллектуальных указателей, и я только использовал их при редактировании некоторого кода, который использует их, никогда в моем собственном коде (могло бы стоить, чтобы сказать, что я - студент).

Можно ли объяснить, каковы типы интеллектуальных указателей, как они работают и когда использовать их?

Кроме того, каковы "протокол" при получении или передающие необработанные указатели в интерфейсах, записанных другими людьми?

Спасибо.

11
задан Amir Rachum 14 August 2010 в 16:11
поделиться

5 ответов

C ++ 98 не предоставляет никаких интеллектуальных указателей, кроме auto_ptr , что чревато собственными проблемами. C ++ 0X пытается исправить это, добавляя еще несколько разновидностей ( shared_ptr , unique_ptr и т. Д.). А пока лучше всего использовать Boost. Взгляните на различные доступные вам вкусы здесь . Boost поддерживается сообществом, тщательно протестирован и, конечно же, бесплатен. Есть отличная документация с примерами кода, которая поможет вам начать работу.

Можете ли вы объяснить, какие типы интеллектуальных указателей бывают, как они работают и когда их использовать?

Их несколько.Вкратце:

scoped_ptr Простое единоличное владение холостым объекты. Без копирования.

scoped_array Простая подошва владение массивами. Без копирования.

shared_ptr Право собственности на объект поделено между несколько указателей.

shared_array массив владение разделено между несколькими указатели.

weak_ptr Не владеет наблюдатели объекта, принадлежащего shared_ptr.

intrusive_ptr Общий владение объектами со встроенным количество ссылок.

(Это из документации Boost, и обратите внимание, что у них тоже есть контейнеры для таких указателей!)

Кроме того, каков «протокол» при получении или передаче необработанных указателей в интерфейсах, написанных другими людьми?

Для меня наиболее важные правила:

  • Const-qualification
  • Не освобождать вещи, которые я не выделял
  • Проверить семантику передачи владения / перемещения
16
ответ дан 3 December 2019 в 07:10
поделиться

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

{
    int* raw = new int(40);
    auto_ptr<int> sp(raw); //inline constructor: internal_holder = raw
    //...
    //inline destructor: delete internal_holder
}

В C ++ удобно использовать указатели косвенно (спрятать их за классами). Накладные расходы на создание нового интеллектуального указателя незначительны. Но shared_ptr более весомый из-за его поведения при подсчете ссылок (это подсчет ссылок).

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

1
ответ дан 3 December 2019 в 07:10
поделиться

Чтобы завершить ответы и те, которые будут доступны в грядущем стандарте C ++ 0x. Эти ссылки дают примеры того, когда и как они используются. Он также документирует взаимосвязь между shared_ptr и weak_ptr.

http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr

http://www2.research.att.com/~bs/C++0xFAQ .html # std-weak_ptr

http://www2.research.att.com/~bs/C++0xFAQ.html#std-unique_ptr

0
ответ дан 3 December 2019 в 07:10
поделиться

О STL auto_ptr, я рекомендую прочитать GuruOfTheWeek Херба Саттера (автора хороших книг по C ++): используйте это Ссылка

0
ответ дан 3 December 2019 в 07:10
поделиться

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

0
ответ дан 3 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

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