Возврат данных закрытого участника unique_ptr без передачи права собственности - PullRequest
0 голосов
/ 05 мая 2019

Context

Ошибка, приведенная ниже, говорит мне, что я не могу вернуть свой unique_ptr с именем m_head из этой функции get. Я просто хочу вернуть свои unique_ptr m_head без передачи права собственности.

Я полностью избегал необработанных указателей с тех пор, как познакомился с интеллектуальными указателями, поскольку необработанные указатели не являются безопасными исключениями, имеют накладные расходы на управление памятью и другие известные мне проблемы. Может быть, есть такие случаи, когда я должен использовать их кратко в небольшом объеме?

В этом я думаю, что вместо моего нынешнего подхода мне нужно передать право собственности. Вместо этого я должен получить объект, управляемый unique_ptr, создать новый shared_ptr для управления объектом, затем вернуть shared_ptr, но мне нужно подтверждение. Я думаю, что это может быть так, потому что std :: unique_ptr документы говорят:

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

Error

 `function "std::unique_ptr<_Ty, _Dx>::unique_ptr(const std::unique_ptr<_Ty, _Dx> &) 
 [with _Ty=mrobsmart::LinkedList::Node, _Dx=std::default_delete<mrobsmart::LinkedList::Node>]" 

 (declared at line 2337 of "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\include\memory")

 cannot be referenced  -- it is a deleted function

Код

#include <memory>

class LinkedList
{
    private:
        std::unique_ptr<Node> m_head;

    public:
        LinkedList(int data) {
            m_head = std::make_unique<Node>(data);
        }

        const std::unique_ptr<Node> get_head() { return m_head; }
};

1 Ответ

2 голосов
/ 05 мая 2019

Я просто хочу вернуть свой unique_ptr m_head без передачи права собственности.

Это невозможно. unique_ptr разработан вокруг поведения, при котором каждое движение передает право собственности.

Обратите внимание, я полностью избегал необработанных указателей с тех пор, как представил их умным указателям, поскольку необработанные указатели не являются безопасными исключениями, имеют накладные расходы на управление памятью и другие известные мне проблемы, но, может быть, есть случаи, когда я должны ли они кратко содержаться в небольшом объеме?

Сырые указатели не являются злом. Использование их в качестве чистых ссылок / косвенных ссылок является вполне допустимым вариантом использования - здесь не требуется владение, управление памятью или безопасность исключений.

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

Итак, любой из них (важно: const - квалифицировать функцию):

    const Node* get_head() const { return m_head.get(); }
    const Node& get_head() const { return *m_head; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...