2013-02-01 3 views

ответ

5

Если helpFunc берет собственность вы проходите зЬй :: shared_ptr или зЬй :: unique_ptr иначе просто пройти по ссылке:

void helperFunc(MyClass& my_class) 
    { 
    } 

вызов:

helperFunc(*p); 
+5

Это глупо. Если функция не хочет брать на себя ответственность *, почему черт является собственностью * (то есть unique_ptr) * даже в интерфейсе *? Способ использования ссылок, не связанных с владельцем, всегда заключался в том, чтобы использовать MyClass или MyClass * или варианты const. * У этого нет причин менять сейчас *. –

+0

Вторичный. Нет ничего плохого в передаче исходных указателей. – Puppy

+0

Единственная потенциальная проблема с исходными указателями заключается в том, что вы работаете с приложением, которое смешивает библиотеки, поддерживающие интеллектуальные указатели (и последовательно их использующие), и библиотеки, которые их не используют (поскольку они нацелены на более старый стандарт). В таком случае вы можете столкнуться с подобными функциями raw-pointer, которые могут или не могут принадлежать. См. Мое сообщение в блоге об использовании [unique_ptr use] (http://wp.me/p2Bia3-2U) – TiMoch

4

При использовании get() функции, вы получить необработанный указатель и потерять отслеживание распределения, которое вы используете в классе unique_ptr, чтобы иметь в первую очередь.

Я бы не использовал get(), если только helperFunc не настолько правдиво, что он не принимает на себя ответственность за указатель и может быть гарантированно не пропустить его или оставить болтающуюся ссылку в каком-либо другом состоянии.

Если вы действительно значит сдадите unique_ptr себя функции, посмотрите на: How do I pass a unique_ptr argument to a constructor or a function?

+0

Да, я полагаю, helperFunc не нуждается в «полном» владении ... но таким образом я оставляю дверь открытой для некоторых проблем в будущее. – fen

+0

@fen: да, это очень оставляет потенциал для будущих проблем. – sheu

7

Если вы не хотите брать на себя ответственность памяти (в этом случае вы должны пройти либо shared_ptr или unique_ptr) , почему вы работаете с указателем?

Прохождение по ссылке.

void helperFunc(MyClass& obj) 
{ 
    // do something with ptr, 
} 

unique_ptr<MyClass> p(new MyClass()); 
helperFunc(*p); 

Использование сырых указателей, если вы не хотите брать на себя ответственность в порядке, но в целом нет необходимости здесь, если вы явно не хотите, чтобы nullptr s (в этом случае, да, используйте сырой указатель).

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