2013-08-07 3 views
1

я прочитал в статье о смарт-указатели в Boost, что:Scoped Pointer in Boost: что означает необработанный указатель?

"scoped_ptr хорош для сырых указателей, в то время как scoped_array полезно для динамических массивов."

Но я не понял, что они подразумевают под «Raw pointers», поэтому ни предложение.

Может ли кто-нибудь из вас объяснить мне это? Благодаря

ответ

1

Raw указатель является указателем введен синтаксис языка с *:

int* ptr; 

Это нормальный POD («сырой» числовой адрес в памяти) переменной, поэтому она разрушает тривиальным. Что важно и раздражает о сырых указателей:

int* ptr = new int(42); 

из-за того, что разрушение ptr является не-оп, delete не будет называться, и вы должны сделать это вручную. Умные указатели обертывают необработанные указатели и уничтожают объекты, на которые указывает (когда это необходимо).

В C++ 11 введены интеллектуальные указатели в стандартную библиотеку в виде unique_ptr и shared_ptr. Вы должны использовать их вместо boost, когда вы используете C++ 11.

Упоминание массивов происходит из-за того, что мы можем представлять массив как указатель на первый элемент и некоторое понятие размера. Например, char* является указателем на первый символ в массиве, и мы знаем, что он заканчивается на '\0'. Динамические распределения таких массивов выполняются оператором new[] (и разрушениями на delete[]); интеллектуальные указатели из стандартной библиотеки могут обрабатывать эти типы тоже, но в общем случае рекомендуется использовать std::vector.

2

Их формулировка является печальной. Под «необработанными» указателями люди обычно подразумевают примитивные типы указателей, независимо от того, на что они указывают. Что они означают:

scoped_ptr подходит для указателей на отдельные объекты, в то время как scoped_array полезен для динамических массивов