Должен ли я использовать умные указатели на всем и забыть о классических нормальных указателях? - PullRequest
6 голосов
/ 23 ноября 2010

Я давно пользуюсь C ++ и хорошо знаю, как аккуратно распределять и освобождать память, особенно не забывая удалять неиспользуемые экземпляры.

Теперь, я только недавно использовал boost, и с проблемой, с которой я сталкиваюсь, я вынужден использовать умные указатели (в частности, shared_ptr). Итак, если я собираюсь использовать shared_ptr для этой проблемы, должен ли я использовать умные указатели для всей моей обычной кодовой базы указателей?

Ответы [ 5 ]

18 голосов
/ 23 ноября 2010

Вы должны использовать умные указатели осторожно.Они не являются серебряной пулей при рассмотрении управления памятью.Циркулярные ссылки все еще остаются проблемой.

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

5 голосов
/ 23 ноября 2010

Да, вы должны предпочесть умные указатели, а не голые указатели практически для всего. Но это не означает, что вы должны использовать ::boost::shared_ptr для большинства из этих случаев. На самом деле я думаю, что вы должны использовать shared_ptr экономно и осторожно.

Но для тех указателей, которые вы не используете shared_ptr, вы должны использовать ::std::auto_ptr или, если у вас есть C ++ 0x ::std::unique_ptr. И если они не подходят, вы должны найти умный тип указателя, который является

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

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

Например, использование интеллектуального указателя в вашем собственном классе интеллектуальных указателей, вероятно, не является правильным решением. Указание на материал, размещенный в библиотеке C, вероятно, потребует специального умного указателя, который вызывает free вместо delete. Возможно, вам нужен гибкий буфер, который вы можете вызвать realloc и по какой-то причине не хотите использовать ::std::vector.

Но обычно умный указатель (хотя обычно не ::boost::shared_ptr (или в C ++ 0x ::std::shared_ptr)) является правильным ответом на вашу проблему управления ресурсами.

1 голос
/ 23 ноября 2010

Да.Вы должны использовать умные указатели Boost почти для всего, если они у вас есть.Помните об этом, хотя вы можете и из своих комментариев действительно эффективно использовать указатели, но люди, которые идут за вами, не могут этого делать.Использование умных указателей может (и, надеюсь, не защитит от плохого кода) смягчить некоторые из этих проблем.

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

0 голосов
/ 23 ноября 2010

Нет, вы не должны использовать умные указатели для всего.Что следует учитывать при наборе new:

  • Каков срок службы этого объекта?
  • Какому объекту принадлежит it?
  • Как этот объект будет управлять своим временем жизни?

Иногда решение - это умный указатель, но также ленивый ответ.«Я не хочу беспокоиться о том, какой объект владеет этим указателем и каким должно быть его время жизни, поэтому я сделаю его указателем shared_pointer!»

Важный вопрос; Что управляет временем жизни этого объекта? , ответ может быть умным указателем, но часто это не обязательно.

0 голосов
/ 23 ноября 2010

Нет. Это зависит от того, что вы делаете.

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