Я в ситуации, когда я не уверен, какой тип умного указателя использовать, потому что я не уверен во всех случаях использования для моего класса. Я мог бы просто использовать общие указатели, но я не люблю идею передачи общих указателей везде в моем коде, когда мне не обязательно нужна совместная собственность. This article Herb Sutter говорит, что когда вы сомневаетесь, используйте unique_ptr и конвертируйте в shared_ptr, когда вам нужно. Это то, что я хотел бы сделать, но я неясно, как это должно быть сделано, рассмотрим следующий пример:shared_ptr и unique_ptr conversion
class Example
{
public:
Example(): _ptr(std::make_unique<Node>()) {}
std::unique_ptr<Node>& getPtr()
{
return _ptr;
}
private:
// I am unsure if I will eventually need shared ownership or not
std::unique_ptr<Node> _ptr;
};
Example* example = new Example();
// Some function somewhere
void f()
{
// I've decided I need shared ownership, converting
std::shared_ptr<Node> ptr(std::move(example->getPtr()));
// Oops, example is no longer valid...
}
Если кто-то имеет лучшее представление о том, как иметь дело с ситуациями, как этот I «Рад это услышать.
unique_ptr и shared_ptr предназначены для ВЛАДЕЛЬЦА используемой памяти, а не для ее простого использования. Вы часто не пропускаете shared_ptr, поскольку они относительно дороги, чтобы сделать, по сравнению с обычными указателями/ссылками. – xaxxon
Будет ли 'Example' * всегда * необходимо поддерживать право собственности на свой узел, а иногда другие объекты также требуют владения этим узлом? – jaggedSpire
Из приведенного выше примера кажется, что ваш указатель должен быть 'shared_ptr', как вы хотите (потенциально) поделиться собственностью. Сомнение может случиться для фабрики. – Jarod42