问题描述
我是智能指针的完全新手,我从未在 C++ 中处理过 weak_ptr
。
我在类 Y
中有一个函数,它接受类 weak_ptr
的 X
作为参数。
在类Y
的函数内部,我需要通过X
访问类weak_ptr
的成员函数。
Y.cpp
class Y {
public : Y();
~Y();
int foo(std::weak_ptr<X> x);
};
X.cpp
class X {
public : std::string func1();
int func2();
};
在类 foo()
的 Y
函数内部,我需要能够使用 func1
访问函数 func2
和 weak_ptr x
。>
我不知道为什么我需要使用 weak_ptr
,但这正是我应该实现的。
我无法使用 weak_ptr
找到任何适合初学者的示例代码。
解决方法
您需要先使用 shared_ptr
将其转换为 .lock()
:
int foo(std::weak_ptr<X> x)
{
std::shared_ptr<X> y = x.lock(); // Or `auto y = x.lock();`.
y->do_stuff();
}
基本原理是 weak_ptr
不拥有所有权(与 shared_ptr
不同),因此如果您可以直接取消引用它,则存在目标对象被不同线程销毁的风险当你这样做的时候。
在使用结果指针 (y
) 之前检查它是否不为 null 可能是个好主意,除非在它为 null 时崩溃是处理您案例中错误的可接受方式。
每次都调用 .lock()
是一个坏的想法(而不是一次并将结果保存到变量中),因为目标可以在调用之间被破坏(而且它会更多成本高)。