2009-08-11 7 views
1

Есть ли жесткая рекомендация относительно того, когда следует использовать boost :: shared_ptr над обычным указателем (T *) и наоборот?Рекомендации по использованию: общие или обычные указатели

+0

Вы имеете в виду 'повышающего :: shared_ptr' и' станд :: tr1 :: shared_ptr'? – bdonlan

+0

Вы никогда не должны использовать указатель RAW. Но это несколько общих указателей для разных ситуаций. См. Http://stackoverflow.com/questions/94227/smart-pointers-or-who-owns-you-baby –

ответ

2

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

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

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

+1

Мое правило в том, что если трудно сказать «что принадлежит этой памяти», у вас плохой дизайн. Применение общей помощи указателя не будет исправлять. – 2009-08-11 16:12:42

+0

@NNeil, делая явное указание указателя не имеет ничего общего с дизайном. –

+0

@jon, наряду с пожизненным временем, является одной из двух наиболее важных проблем, которые должен решить любой дизайн: – 2009-08-11 19:41:11

2

Простое руководство, что почти исключает возможность памяти утечек: всегда использовать именованный смарт переменную указатель удерживать результат новый.

boost::shared_ptr documentation

+1

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

+0

Пока ничего не знаешь, делится указателем с создающим объектом. –

+0

Нестандартная семантика копии auto_ptr может сильно вас укусить, если вы не будете осторожны. –

1

Если вы не строите смарт-указатель (не), то вы должны, вероятно, не используя RAW указатель (Это путь ведет к безумию).

Есть множество умных указателей для различных ситуаций:
станда :: auto_ptr:
станда :: tr1 :: shared_ptr AKA (повышение :: shared_ptr)
повышения :: scoped_ptr
повышения :: weak_ptr

Smart Pointers: Or who owns you baby?

Единственная причина для передачи указателя является передать ссылку на объект, который потенциально может быть NULL (в противном случае используйте ссылку), то есть вы НЕ передавая право собственности только на использование объекта (и если вы передаете NULL, возможно, вам стоит посмотреть на код и спросить, почему).

БППП контейнеры не обрабатывают ссылки хорошо, так что вы можете поместить указатели на объекты, принадлежащие кому-то еще в стандартном контейнере (см Using abstract class as a template type)

Смежные вопросы