Ускоренный C ++: можно ли заменить «сырые» указатели интеллектуальными указателями? - PullRequest
4 голосов
/ 20 февраля 2011

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

Ответы [ 3 ]

4 голосов
/ 20 февраля 2011

«Умный указатель» немного неправильный.«Умная» часть заключается в том, что они сделают для вас кое-что, нужно вам или нет, хотите или даже поймете, что это за вещи.И это действительно важно.Потому что иногда вам захочется пойти в магазин, а умные указатели приведут вас в церковь .Умные указатели решают некоторые очень специфические проблемы.Многие утверждают, что если вы думаете, что вам нужны умные указатели, то вы, вероятно, решаете не ту проблему .Я лично стараюсь не принимать сторону.Вместо этого я использую метафору набора инструментов - вам нужно по-настоящему понять проблему, которую вы решаете, и инструменты, которыми вы располагаете.Только тогда вы можете ожидать, что выберете правильный инструмент для работы.Желаем удачи и продолжайте задавать вопросы!

2 голосов
/ 20 февраля 2011

Нет.

Указатели, которые представляют владение объектом, должны быть заменены умными указателями.

Другие указатели должны быть заменены итераторами (в простейшем случае это просто typedef длянеобработанный указатель, но никто бы не подумал, что его нужно удалить).

И, конечно, код реализации для интеллектуальных указателей и итераторов будет по-прежнему нуждаться в необработанных указателях.

2 голосов
/ 20 февраля 2011

Ну, есть разные виды умных указателей. Например:

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

Что-то вроде:

template <typename T>
class scoped_ptr
{
 public:
    scoped_ptr(T* p = 0) : mPtr(p) {}
    ~scoped_ptr() { delete mPtr; }
 //...
};

Кроме того, вы можете создать shared_ptr, который действует так же, но ведет подсчет реф. Как только количество ссылок достигнет 0, вы освобождаетесь.

shared_ptr будет полезен для указателей, хранящихся в контейнерах STL и т. П.

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

Не просто "находите и заменяйте" все указатели, с которыми вы сталкиваетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...