C++ C++  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

RAII и управление ресурсами

Тест рассматривает ресурс шире памяти: файл, блокировка, сокет, транзакция и временное состояние должны иметь ясного владельца и освобождаться на любой ветке выполнения. Вопросы проверяют, умеет ли разработчик увидеть окно утечки ещё до того, как оно проявится в аварии.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 20 вопросов, время — 55 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 20
Какой тип лучше всего выражает единственное владение динамическим объектом?
C++C++20
std::unique_ptr<Widget> make_widget() {
    return std::make_unique<Widget>();
}

auto widget = make_widget();
widget->run();
Вопрос 2 из 20
Что произойдёт при передаче p в consume?
C++C++20
#include <memory>

void consume(std::unique_ptr<int> value) {
    (void)value;
}

int main() {
    auto p = std::make_unique<int>(7);
    consume(std::move(p));
}
Вопрос 3 из 20
Какая сигнатура яснее всего говорит “функция лишь наблюдает объект и допускает его отсутствие”?
C++C++20
void inspect(const Widget* widget) {
    if (!widget) return;
    std::cout << widget->name();
}

inspect(nullptr);
inspect(&existing);
Вопрос 4 из 20
Почему возвращать сырой указатель из фабрики `create()` опасно без строгого соглашения?
C++C++20
Widget* create_widget();

void run() {
    Widget* widget = create_widget();
    process(*widget);
    // Кто и каким способом должен освободить widget?
}
Вопрос 5 из 20
Какой контракт наиболее разумен для метода `Widget* parent() const`?
C++C++20
class Widget {
public:
    Widget* parent() const noexcept { return parent_; }
private:
    Widget* parent_ = nullptr; // невладеющая, допускающая отсутствие связь
};
Вопрос 6 из 20
Закроется ли файл при раннем return?
C++C++20
#include <fstream>
bool save(bool skip) {
    std::ofstream file("out.txt");
    if (skip) return false;
    file << "data";
    return true;
}
Вопрос 7 из 20
Почему явный `delete p` рядом с unique_ptr опасен?
C++C++20
auto owner = std::make_unique<int>(5);
int* p = owner.get();
delete p;
Вопрос 8 из 20
В каком порядке освободятся guard и file при выходе из блока?
C++C++20
File file("log.txt");
LockGuard guard(mutex);
Вопрос 9 из 20
Какой эффект даёт `std::lock_guard<std::mutex> lock(m);`?
C++C++20
std::mutex mutex;
std::vector<Event> events;

void append(Event event) {
    std::lock_guard<std::mutex> lock(mutex);
    events.push_back(std::move(event));
}
Вопрос 10 из 20
Почему RAII упрощает обработку исключений?
Вопрос 11 из 20
Как завернуть FILE* так, чтобы fclose вызывался автоматически?
C++C++20
using File = std::unique_ptr<FILE, decltype(&std::fclose)>;

File file(std::fopen("data.bin", "rb"), &std::fclose);
if (!file)
    throw std::system_error(errno, std::generic_category());
Вопрос 12 из 20
Что должен делать перемещающий конструктор обёртки сокета?
Вопрос 13 из 20
Какой deleter нужен для памяти от `malloc`?
C++C++20
using Buffer = std::unique_ptr<std::byte, decltype(&std::free)>;

void* raw = std::malloc(4096);
if (!raw) throw std::bad_alloc{};
Buffer buffer(static_cast<std::byte*>(raw), &std::free);
Вопрос 14 из 20
Как RAII-объект транзакции может реализовать откат?
Вопрос 15 из 20
Почему владеющая обёртка должна запрещать копирование, если ресурс нельзя безопасно дублировать?
Вопрос 16 из 20
Почему RAII-обёртка ресурса должна быть перемещаемой, чтобы её можно было хранить в `std::vector`?
Вопрос 17 из 20
Какой риск есть у callback, захватившего `this`, если его сохранит внешний диспетчер?
C++C++20
class Window {
public:
    void start() {
        dispatcher_.post([this] { refresh(); });
    }
    ~Window() = default;
private:
    Dispatcher& dispatcher_;
};
Вопрос 18 из 20
Когда именно сработает очистка в RAII-объекте `Guard`, объявленном в начале функции?
Вопрос 19 из 20
Какой дизайн безопаснее для фоновой задачи?
Вопрос 20 из 20
Можно ли использовать указатель, полученный из `file.get()` после уничтожения owner?
C++C++20
FILE* raw = nullptr;
{
    FileOwner owner = open_file();
    raw = owner.get();
}
// owner уже уничтожен

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

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

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

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