auto_ptr Ловушки и ловушки - PullRequest
       5

auto_ptr Ловушки и ловушки

5 голосов
/ 01 сентября 2010

Помимо всех известных преимуществ использования auto_ptrs, что такое auto_ptr "худшая практика"?

  1. Создание STL-ограничителей auto_ptrs. auto_ptrs не соответствует требованию «CopyConstructable». См. Также «Эффективный STL» Скотта Мейера, пункт 8.

  2. Создание auto_ptrs массивов После уничтожения деструктор auto_ptr использует «delete» (и никогда «delete []»), чтобы уничтожить принадлежащий объект, поэтому этот код дает неопределенное поведение: auto_ptr api (новый int [42]);

  3. Не заботясь о copy-ctor и op = в классе с использованием членов auto_ptr. Можно наивно думать, что при использовании членов auto_ptr не нужно реализовывать конструктор копирования / оператор присваивания для класса. Однако даже один элемент auto_ptr «отравляет» класс (т. Е. Нарушает требования «CopyConstructable» и «Assignable»). Объекты таких классов будут частично повреждены во время операции копирования / присваивания.

Есть ли еще какие-либо проблемы с auto_ptr?

1 Ответ

6 голосов
/ 01 сентября 2010

Не уверен, является ли это ловушкой / ловушкой, но это, безусловно, менее чем очевидно:

  • Const auto_ptr не может передать свое владение содержащимся указателем

Другими словами:

const auto_ptr<Foo> ap(new Foo());
auto_ptr<Foo> ap2;

ap2 = ap; // Not legal!

Это на самом деле весьма полезно , если вы хотите принять аргумент auto_ptr и гарантировать, что вы не станете владельцем принадлежащего указателя, но этоТакже может быть удивительно, если вы ожидаете, что const auto_ptr<Foo> будет вести себя как Foo const*.

...