2010-09-08 2 views
2

Предыдущий, у меня есть следующий код.Нужно ли указывать нулевой указатель на std :: auto_ptr

double* a[100]; 
for (int i = 0; i < 100; i++) { 
    // Initialize. 
    a[i] = 0; 
} 

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

for (int i = 0; i < 100; i++) { 
    // Fine. 
    delete a[i]; 
} 

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

std::auto_ptr<double> a[100]; 
for (int i = 0; i < 100; i++) { 
    // Initialize. Is there any need for me to do so still? 
    a[i] = std::auto_ptr<double>(0); 
} 

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

+2

Возможно, вы можете объяснить, почему, по-вашему, вы хотите, чтобы массив указателей удваивался в первую очередь. Изменение этого на массив 'auto_ptr ' звучит для меня так, как будто у него нет реальной проблемы. –

ответ

6

C++ 03 определяет конструктор auto_ptr следующим образом:

explicit auto_ptr(X* p =0) throw();    // Note the default argument 

Postconditions: *this holds the pointer p. 

Это означает, что ниже отлично сформированный. Нет необходимости инициализировать

auto_ptr<int> a = auto_ptr<int>(); 
2

Вы можете обнулить инициализировать все элементы массива с помощью:

double* a[100] = {0}; // is equivalent 

альтернатива удалению с помощью for_each:

struct delete_object 
{ 
    template <typename T> 
    void operator()(T *ptr){ delete ptr;} 
}; 

//later in the code... 
std::for_each(&a[ 0 ], &a[ 0 ] + sizeof a/sizeof a[ 0 ], delete_object()); 

Теперь ваш вопрос:

ли есть ли необходимость в инициализации auto_ptr для хранения нулевого указателя?

Нет необходимости инициализировать массив auto_ptr. Элементы будут инициализированы по умолчанию, если вы оставите это.

Однако обратите внимание, что auto_ptr может не использоваться для семантики его перемещения (копия права собственности), если вам нужно передать указатели на другие функции. Кроме того, в следующем стандарте auto_ptr, скорее всего, будет устаревшим. Попробуйте использовать что-то наподобие std::tr1::unique_ptr или std::tr1::shared_ptr (последний является посчитанным интеллектуальным указателем).

6

std::auto_ptr Конструктор «s по умолчанию делает NULL-задание для вас - или, в качестве стандарта (ISO/IEC 14882: 1998) ставит его, конструктор объявлен как:

явный auto_ptr (X * р = 0) throw();

(X) является классом параметров шаблона, то есть для std::auto_ptr<X>).

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