Какие знаешь умные указатели · C/C++ Backend — JobPilot

Какие знаешь умные указатели

C/C++ Backend · 30%
Вопрос 4122 / #
Пример ответа

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

Ключевые идеи:
  • std::unique_ptr обеспечивает эксклюзивное владение ресурсом с автоматическим освобождением при выходе из области видимости
  • std::shared_ptr реализует совместное владение через подсчёт ссылок, что удобно для разделяемых ресурсов
  • std::weak_ptr используется вместе с shared_ptr для предотвращения циклических ссылок без увеличения счётчика
Пример: В моём проекте обработки сетевых соединений я использовал unique_ptr для владения сокетами и shared_ptr для кэширования сессий, что исключило ручное управление памятью.
Пример использования умных указателей для управления ресурсами соединения в серверном приложении
cpp
#include <memory>
#include <iostream>

class Connection {
public:
    Connection() { std::cout << "Connection established\n"; }
    ~Connection() { std::cout << "Connection closed\n"; }
    void send(const std::string& msg) { std::cout << "Sending: " << msg << "\n"; }
};

int main() {
    // unique_ptr для эксклюзивного владения соединением
    std::unique_ptr<Connection> conn = std::make_unique<Connection>();
    conn->send("Hello");
    // Автоматическое освобождение при выходе из области

    // shared_ptr для разделяемого кэша сессий
    std::shared_ptr<Connection> session = std::make_shared<Connection>();
    {
        std::shared_ptr<Connection> anotherRef = session; // Счётчик ссылок = 2
        anotherRef->send("From cache");
    } // Счётчик ссылок = 1, объект жив
    session->send("Still alive");

    // weak_ptr для наблюдения без владения
    std::weak_ptr<Connection> observer = session;
    if (auto locked = observer.lock()) {
        locked->send("Accessed via weak_ptr");
    } else {
        std::cout << "Resource expired\n";
    }
    return 0;
}
Вопросы для интервьюера:
  • Как вы выбираете между unique_ptr и shared_ptr в проекте?Использую unique_ptr по умолчанию для ясности владения, а shared_ptr только при реальной необходимости разделения, чтобы избежать накладных расходов.
  • Какие проблемы могут возникнуть с shared_ptr в многопоточных приложениях?Синхронизация счётчика ссылок может снизить производительность; я решаю это через локальное кэширование или атомарные операции, где это критично.
Практический совет (на неделю):
  1. Начните с unique_ptr для всех владеющих указателей и переходите на shared_ptr только при явной необходимости разделения.
  2. Используйте make_unique и make_shared вместо new для безопасности исключений и оптимизации выделения памяти.
C/C++ Backend
Общий
30%
Навигация
Почему уволился с последнего места работы
Следующий: Какие зарплатные ожидания
Предыдущий: Почему уволился с последнего места работы

Мы используем cookie для улучшения сайта. Продолжая пользоваться сайтом, вы соглашаетесь с политикой cookie и политикой конфиденциальности.