Я прочитал в статье о Умные Указатели в Boost, что:
«scoped_ptr хорошо для сырые указатели, в то время как scoped_array полезно для динамические массивы.»
Но я не понял, что они имеют в виду под «сырыми указателями», так что ни предложение.
Может ли кто-нибудь из вас объяснить мне это? Спасибо
Их формулировка неудачна. Под «необработанными» указателями люди обычно подразумевают примитивные типы указателей, независимо от того, на что они указывают. Что они имеют в виду:
scoped_ptr хорош для указателей на отдельные объекты, а scoped_array полезен для динамических массивов
Необработанный указатель — это указатель, введенный синтаксисом языка с *
:
int* ptr;
Это обычная переменная POD («необработанный» числовой адрес в памяти), поэтому она разрушается тривиально. Что важно и раздражает в необработанных указателях:
int* ptr = new int(42);
из-за того, что уничтожение ptr
это неоперация, delete
не будет вызван, и вы должны сделать это вручную. Умные указатели обертывают необработанные указатели и уничтожают указанные объекты (когда это необходимо).
C ++ 11 ввел умные указатели в стандартную библиотеку в виде unique_ptr
а также shared_ptr
, Вы должны использовать их вместо бустеров при настройке на C ++ 11.
Упоминание массивов происходит от того факта, что мы можем представлять массив как указатель на первый элемент и некоторое представление о размере. Например, char*
является указателем на первый символ в массиве, и мы знаем, что он заканчивается в '\0'
, Динамическое размещение таких массивов выполняется new[]
оператор (и разрушения delete[]
); умные указатели из стандартной библиотеки тоже могут обрабатывать эти типы, но в общем случае std::vector
рекомендуется вместо этого.