Sobes.tech
Back to questions
Junior — Middle
88

Для чего используется умный указатель weak_ptr в C++ и как он отличается от shared_ptr?

Answer from AI

sobes.tech AI

weak_ptr в C++ используется для хранения слабой ссылки на объект, управляемый shared_ptr, без увеличения счетчика ссылок. Это помогает избежать циклических зависимостей, которые могут привести к утечкам памяти.

Основные отличия:

  • shared_ptr владеет объектом и увеличивает счетчик ссылок, гарантируя, что объект жив, пока есть хотя бы один shared_ptr.
  • weak_ptr не владеет объектом и не влияет на счетчик ссылок. Он позволяет проверить, существует ли объект, и получить shared_ptr, если объект еще жив.

Пример:

#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> sp = std::make_shared<int>(42);
    std::weak_ptr<int> wp = sp; // не увеличивает счетчик

    if (auto spt = wp.lock()) { // пытаемся получить shared_ptr
        std::cout << "Объект существует: " << *spt << std::endl;
    } else {
        std::cout << "Объект удален" << std::endl;
    }

    sp.reset(); // объект удаляется, так как shared_ptr больше нет

    if (wp.expired()) {
        std::cout << "Объект больше не существует" << std::endl;
    }
}