C++ C++  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Умные указатели

Тест разбирает модели владения, а не просто названия классов. Вопросы проверяют передачу unique_ptr, устройство контрольного блока shared_ptr, безопасное наблюдение через weak_ptr и циклы, которые не видит обычный подсчёт ссылок.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, время — 70 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 25
Что верно после `auto q = std::move(p);`?
C++C++20
auto p = std::make_unique<int>(42);
auto q = std::move(p);
Вопрос 2 из 25
Чем `release()` отличается от `reset()`?
C++C++20
auto owner = std::make_unique<Resource>();
Resource* raw = owner.release(); // owner теперь пуст, raw надо освободить вручную

auto other = std::make_unique<Resource>();
other.reset();                  // объект уничтожен, other пуст
Вопрос 3 из 25
Как правильно создать unique_ptr для динамического массива из десяти int?
C++C++20
auto values = std::make_unique<int[]>(10);
for (std::size_t i = 0; i < 10; ++i)
    values[i] = static_cast<int>(i * i);

std::cout << values[9];
Вопрос 4 из 25
Когда пользовательский deleter становится частью типа unique_ptr?
C++C++20
struct CloseFile {
    void operator()(std::FILE* f) const noexcept {
        if (f) std::fclose(f);
    }
};
using FilePtr = std::unique_ptr<std::FILE, CloseFile>;
Вопрос 5 из 25
Какая сигнатура яснее всего принимает владение?
C++C++20
class Repository {
public:
    void set_cache(std::unique_ptr<Cache> cache) {
        cache_ = std::move(cache);
    }
private:
    std::unique_ptr<Cache> cache_;
};
Вопрос 6 из 25
Что хранит контрольный блок shared_ptr?
Вопрос 7 из 25
Почему `std::make_shared<T>` часто эффективнее `std::shared_ptr<T>(new T)`?
C++C++20
auto a = std::shared_ptr<Node>(new Node(42));
auto b = std::make_shared<Node>(42);

// a обычно требует отдельного блока для Node и control block;
// b может объединить их.
Вопрос 8 из 25
Что опасно в создании двух shared_ptr из одного сырого указателя отдельными конструкторами?
C++C++20
T* raw = new T;
std::shared_ptr<T> a(raw);
std::shared_ptr<T> b(raw);
Вопрос 9 из 25
Зачем нужен `std::enable_shared_from_this<T>`?
C++C++20
class Session : public std::enable_shared_from_this<Session> {
public:
    std::shared_ptr<Session> self() {
        return shared_from_this();
    }
};

auto session = std::make_shared<Session>();
Вопрос 10 из 25
Что делает aliasing-конструктор shared_ptr?
Вопрос 11 из 25
Продлевает ли weak_ptr жизнь объекта?
Вопрос 12 из 25
Что возвращает `w.lock()`, если объект уже уничтожен?
C++C++20
std::weak_ptr<Session> weak;
{
    auto owner = std::make_shared<Session>();
    weak = owner;
}

auto locked = weak.lock();
Вопрос 13 из 25
Почему отдельная проверка `expired()` перед `lock()` недостаточна в многопоточном коде?
C++C++20
std::weak_ptr<Session> weak = registry.find(id);

if (!weak.expired()) {
    // Между проверкой и lock последний владелец может исчезнуть.
    auto owner = weak.lock();
    use(owner);
}
Вопрос 14 из 25
Какой тип поля подходит наблюдателю, который не должен владеть Subject, но Subject управляется shared_ptr?
C++C++20
class Observer {
public:
    explicit Observer(std::shared_ptr<Subject> subject)
        : subject_(subject) {}
    void poll() {
        if (auto subject = subject_.lock()) subject->read();
    }
private:
    std::weak_ptr<Subject> subject_;
};
Вопрос 15 из 25
Что покажет проверка weak_ptr после выхода единственного владельца из блока?
C++C++20
#include <iostream>
#include <memory>
int main(){
    std::weak_ptr<int> w;
    { auto p = std::make_shared<int>(1); w = p; }
    std::cout << (w.lock() ? "alive" : "gone");
}
Вопрос 16 из 25
Почему два объекта с взаимными shared_ptr могут не разрушиться?
Вопрос 17 из 25
Как обычно проектируют связь ребёнок → родитель в дереве, если родитель владеет детьми?
Вопрос 18 из 25
Может ли callback, хранящий shared_ptr на владельца, образовать цикл?
Вопрос 19 из 25
Как исправить цикл в callback?
Вопрос 20 из 25
Почему нельзя механически заменить все shared_ptr в цикле на weak_ptr?
Вопрос 21 из 25
Почему `use_count() == 1` не стоит использовать как основу синхронизации?
C++C++20
std::shared_ptr<State> state = load_state();

if (state.use_count() == 1) {
    // Другой поток может получить копию shared_ptr сразу после проверки.
    mutate(*state);
}
Вопрос 22 из 25
Как AddressSanitizer поможет при ошибочном создании двух контрольных блоков?
Вопрос 23 из 25
Как проверить пользовательский deleter?
Вопрос 24 из 25
Что сигнализирует о подозрительном shared_ptr в параметре `void draw(std::shared_ptr<const Shape>)`?
C++C++20
void draw(std::shared_ptr<const Shape> shape) {
    renderer.draw(*shape);
}

// Функция не сохраняет shape и не участвует в его владении.
Вопрос 25 из 25
Какой тест ловит цикл владения?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу