Как использовать unique_ptr после передачи его функции? - PullRequest
1 голос
/ 10 мая 2019

Я только начал изучать новую модель памяти C ++:

#include <string>
#include <iostream>
#include <memory>

void print(unique_ptr<std::string> s) {
        std::cout << *s << " " <<  s->size() << "\n";
}

int main() {
        auto s = std::make_unique<std::string>("Hello");
        print(std::move(s));
        std::cout << *s;
        return 0;
}

Прямо сейчас вызов cout << *s; приводит к segfault, как и должно быть.Я понимаю, почему это происходит.Но я также хотел бы знать, есть ли способ вернуть право собственности.Я хотел бы иметь возможность использовать значение после передачи его функции.

1 Ответ

7 голосов
/ 10 мая 2019

Если вы не хотите передавать право собственности на принадлежащий объект, не передавайте unique_ptr функции. Вместо этого передайте ссылку или необработанный указатель на функцию (в современном стиле C ++ необработанный указатель обычно считается не владеющим). В случае, когда вы просто хотите прочитать объект, обычно подходит константная ссылка:

void print(const std::string&);
// ...
print(*s);
...