Пример ответа
Коротко: Я активно использую умные указатели в 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 в многопоточных приложениях? — Синхронизация счётчика ссылок может снизить производительность; я решаю это через локальное кэширование или атомарные операции, где это критично.
Практический совет (на неделю):
- Начните с unique_ptr для всех владеющих указателей и переходите на shared_ptr только при явной необходимости разделения.
- Используйте make_unique и make_shared вместо new для безопасности исключений и оптимизации выделения памяти.
C/C++ Backend
Общий
30%
Следующий: Какие зарплатные ожидания
Предыдущий: Почему уволился с последнего места работы