面试题答案
一键面试避免循环引用导致内存泄漏的方法
在图形渲染系统中,当多个对象可能相互引用时,使用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
函数结束时,a
和b
超出作用域,它们管理的对象A
和B
会被正确销毁,不会发生内存泄漏。