Что выведет код Middle RAII и умные указатели обновлено

Что выведет: use_count и weak_ptr

Вопрос

Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.

#include <iostream>
#include <memory>

int main() {
    auto p = std::make_shared<int>(5);
    std::cout << p.use_count() << '\n';
    {
        auto q = p;
        std::cout << p.use_count() << '\n';
    }
    std::weak_ptr<int> w = p;
    std::cout << p.use_count() << ' ' << w.expired() << '\n';
    auto u = std::move(p);
    std::cout << (p == nullptr) << ' ' << u.use_count() << '\n';
    u.reset();
    std::cout << w.expired() << '\n';
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 1, 2, 1 0, 1 1, 1. Копия q увеличивает счётчик до 2, после блока снова 1. weakptr сильный счётчик не меняет, объект жив: expired() ложно.

Что выведет

1
2
1 0
1 1
1

Разбор

Копия q увеличивает счётчик до 2, после блока снова 1. weak_ptr сильный счётчик не меняет, объект жив: expired() ложно. Перемещение передаёт владение без изменения счётчика: p пуст, у u счётчик 1. После reset объект уничтожен, w.expired() истинно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.