Вопросы, связанные с дизайном на основе shared_ptr - PullRequest
0 голосов
/ 22 марта 2011

Я использую shared_ptr в своем проекте приложения, и у меня есть тенденция к тому, что все больше и больше объектов распределяются в куче, а не становятся простыми объектами в стеке (или агрегатами более сложных объектов).Вместо простого (но с риском, что Foo :: bar станет висячей ссылкой в ​​более сложной ситуации) ... <pre> struct Bar { }; struct Foo { Foo(Bar& bar) : bar(bar) { }; Bar& bar; }; int main() { Bar bar; Foo foo(bar); // ... } ... Мне нужно сделать ... <pre> struct Bar { }; struct Foo { Foo(shared_ptr bar) : bar(bar) { }; shared_ptr<Bar> bar; }; int main() { shared_ptr<Bar> bar = make_shared<Bar>(); Foo foo(bar); // ... } ... потому чтоЯ хочу избегать ручного отслеживания объектов при жизниЯ пропустил пункт в использовании shared_ptr или это плата за автоматическое управление продолжительностью жизни?А может это плохой дизайн знака?

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

Это вопрос жизненного цикла вашего объекта. Вы должны использовать shared_ptr, когда вы действительно разделяете объект между несколькими другими объектами.

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

Я лично использую умные указатели, чтобы выразить право собственности на объект. Shared_ptr означает, что он действительно доступен, и я не единственный владелец этого объекта. Области или уникальный указатель показывают, что я единственный владелец объекта. Если вы хотите передать владение, вы можете использовать auto_ptr или семантику перемещения C ++ 0x.

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

Чтобы ответить на ваш вопрос, если это плохой дизайн. Это зависит от того, что вы делаете.

2 голосов
/ 22 марта 2011

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

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

0 голосов
/ 22 марта 2011

Вы пытались работать со значениями вместо указателей?

...