MST

星途 面试题库

面试题:C++智能指针内存管理优势之高级题

假设你正在开发一个复杂的图形渲染系统,其中有多个对象可能相互引用。请阐述如何合理使用智能指针(如`std::shared_ptr`和`std::weak_ptr`)来避免循环引用导致的内存泄漏,并给出简单代码示例说明解决方案。
33.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

避免循环引用导致内存泄漏的方法

在图形渲染系统中,当多个对象可能相互引用时,使用std::shared_ptr可能会导致循环引用,从而造成内存泄漏。std::weak_ptr可以用来解决这个问题。std::weak_ptr是一种弱引用,它指向由std::shared_ptr管理的对象,但不会增加对象的引用计数。当std::shared_ptr管理的对象被销毁时,指向该对象的所有std::weak_ptr会自动变为空指针。

代码示例

#include <iostream>
#include <memory>

class B;

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

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

void test() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();

    a->weakRefToB = b;
    b->sharedRefToA = a;
}

int main() {
    test();
    return 0;
}

在上述代码中,A类使用std::weak_ptr指向B类对象,B类使用std::shared_ptr指向A类对象。这样就避免了循环引用。当test函数结束时,ab超出作用域,它们管理的对象AB会被正确销毁,不会发生内存泄漏。