MST

星途 面试题库

面试题:C++中std::weak_ptr如何解决简单的循环引用

假设有两个类A和B,它们之间存在循环引用,请使用C++的std::weak_ptr来打破这种循环引用,并简要说明std::weak_ptr在其中起到的作用。请给出完整的代码示例。
30.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <memory>

class B;

class A {
public:
    std::weak_ptr<B> b_ptr;
    ~A() {
        std::cout << "A destroyed" << std::endl;
    }
};

class B {
public:
    std::shared_ptr<A> a_ptr;
    ~B() {
        std::cout << "B destroyed" << std::endl;
    }
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();

    a->b_ptr = b;
    b->a_ptr = a;

    return 0;
}

在这个代码示例中,std::weak_ptr起到的作用是:它是一种弱引用,不会增加对象的引用计数。在A类中使用std::weak_ptr<B>来指向B类对象,这样当AB对象互相引用时,std::weak_ptr不会像std::shared_ptr那样增加引用计数,从而打破了循环引用。当AB对象的其他std::shared_ptr都被销毁后,这两个对象就可以正常析构,避免了内存泄漏。