Что делает умные указатели лучше, чем обычные указатели? - PullRequest
2 голосов
/ 04 октября 2009

Что делает умные указатели лучше, чем обычные указатели?

Ответы [ 7 ]

11 голосов
/ 04 октября 2009

Они упрощают проблему управления ресурсами. Как только вы удерживаете свои ресурсы в умных указателях, они освобождают для вас память, когда они выходят за рамки применения технологий RAII .

Это имеет два основных преимущества: код безопаснее (менее подвержен утечкам ресурсов) и программирование проще, поскольку вам не нужно помнить в каждой части кода, должен ли ресурс, который вы держите, освобождаться вручную.

7 голосов
/ 04 октября 2009

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

Вот что делают умные указатели.

A shared_ptr реализует подсчет ссылок, поэтому, когда все указатели на объект уничтожаются, объект удаляется.

Другие, такие как scoped_ptr или unique_ptr или auto_ptr, реализуют различные формы исключительной собственности. Когда scoped_ptr уничтожается, он удаляет объект, на который он указывает.

7 голосов
/ 04 октября 2009

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

5 голосов
/ 04 октября 2009

Меньше утечек памяти. Может быть, Скотт Мейерс сможет прояснить для вас:

  1. Эффективный C ++
  2. Более эффективный C ++
3 голосов
/ 04 октября 2009

Автоматический подсчет и освобождение ссылок.

2 голосов
/ 04 октября 2009

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

Если умный указатель, о котором вы говорите, это std :: auto_ptr, он может быть значительно хуже простого указателя. Но это не столько проблема умных указателей, сколько проблема семантики присваивания.

Тем не менее, умные указатели очень часто полезны - даже страшный auto_ptr - особенно (как упомянуто выше) безопасность исключений WRT.

1 голос
/ 04 октября 2009

Посмотрите на:

Умные указатели

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