2010-08-14 5 views
11

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

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

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

Спасибо.

+1

Немного поиск на этом самом месте дает вам следующие http://stackoverflow.com/search?q=smart+pointers – celavek

+0

Много различных возможных дубликатов на этот вопрос ... –

ответ

15

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

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

Есть их несколько. Короче говоря:

scoped_ptr<boost/scoped_ptr.hpp> Простой исключительное владение отдельных объектов. Noncopyable.

scoped_array<boost/scoped_array.hpp> Простая подошва собственность массивов. Noncopyable.

shared_ptr<boost/shared_ptr.hpp> собственности объекта совместно нескольких указателей.

shared_array <boost/shared_array.hpp> Массив собственности распределяются между несколькими указателями.

weak_ptr <boost/weak_ptr.hpp> Non-владеющей наблюдателями объекта, принадлежащего shared_ptr.

intrusive_ptr <boost/intrusive_ptr.hpp> Общий собственность объектов с встроенным счетчик ссылок.

(То есть от повышающей документации и отмечает, что у них есть контейнеры для таких указателей тоже!)

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

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

  • Const-квалификационная
  • Не освободить вещи я не выделял
  • Проверка на передачу прав собственности/перемещения семантику
+2

Хорошее суммирование. Я не согласен с тем, что auto_ptr чреват проблемами. Если yuo не понимает, что он делает, это может занять вас врасплох, но это решается путем чтения документации. Кроме того, новый C++ 0x обеспечивает std :: unique_ptr, что практически является заменой для auto_ptr, но делает семантику перемещения более очевидной для новичков. Также было бы неплохо увидеть, какие из них были включены в новую стандартную библиотеку lib. –

+0

Предоставлено. Я был немного суровым, и мы продолжим жить с 'auto_ptr' (хотя моя копия проекта, т. Е. N3090, говорит, что она устарела). – dirkgently

+0

Вызов дополнительной документации «отлично» немного растягивается :). Качество идет вверх и вниз, в зависимости от рассматриваемого lib. Но хороший ответ вообще, +1. – Lucas

0

О STL auto_ptr, я рекомендую прочитать Herb Sutter's (автор хороших книг на C++) GuruOfTheWeek: используйте это Link

1

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

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

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

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

0

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

0

Чтобы заполнить ответы и те, которые доступны с помощью следующего стандарта 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

Смежные вопросы