std :: auto_ptr <T>Использование - PullRequest
3 голосов
/ 18 августа 2011

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

auto_ptr может содержать только один тип (инициализация массива new [] не поддерживается). Он меняет владельца, когда вы передаете его в функции или пытаетесь дублировать его (это не умный указатель подсчета ссылок).

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

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

Ответы [ 2 ]

7 голосов
/ 18 августа 2011

Я приведу вам короткий пример для хорошего использования.Учтите это:

auto_ptr<SomeResource> some_function() {
    auto_ptr<SomeResource> my_ptr = get_the_resource();

    function_that_throws_an_exception();

    return my_ptr;
}

Функция, которая вызывает исключение, обычно приводит к потере вашего указателя, и объект, на который указывает указатель, не будет удален.С auto_ptr это не может произойти, поскольку он уничтожается, когда покидает созданный кадр, если он не был назначен (например, с return).

4 голосов
/ 18 августа 2011

auto_ptr устарело в окончательно завершенном стандарте C ++ 11.Некоторые замены уже доступны через библиотеки TR1 или Boost .Примерами являются shared_ptr и unique_ptr (scoped_ptr в ускорении).

...