Это вопрос жизненного цикла вашего объекта. Вы должны использовать shared_ptr, когда вы действительно разделяете объект между несколькими другими объектами.
В вашем случае владелец FOO и BAR должен контролировать жизненный цикл обоих. Может быть, возможно сделать BAR частным членом вашего класса FOO и позволить FOO контролировать жизненный цикл.
Я лично использую умные указатели, чтобы выразить право собственности на объект. Shared_ptr означает, что он действительно доступен, и я не единственный владелец этого объекта.
Области или уникальный указатель показывают, что я единственный владелец объекта. Если вы хотите передать владение, вы можете использовать auto_ptr или семантику перемещения C ++ 0x.
Я видел, по крайней мере, в более крупных проектах, что отсутствие контроля жизненного цикла приведет к висящим объектам. Таким образом, у вас больше нет прямой утечки памяти из-за автоматического управления временем жизни, но вы получаете циклические зависимости. Которые приводят к тому же результату.
Чтобы ответить на ваш вопрос, если это плохой дизайн. Это зависит от того, что вы делаете.