shared_ptr作为函数参数时, 无论是值传递还是引用传递都增加引用计数, 两者效果一样。为什么会出现weak_ptr?对shared_ptr对象的错误引用导致内存泄露: 例如:两个类的数据成员互相引用, 会导致互相的资源无法释放。参考用例:第 5 章 智能指针与内存管理 现代 C++ 教程: 高速上手 C++ 11/14/17/20 - Modern C++ Tutorial: C++ 11/14/17/20 On the Flyweak_ptr不拥有资源, 不能阻止shared_ptr释放资源weak_ptr.lock()方法可以获取shared_ptr指针, 从而操作shared_ptr对象的数据成员, 如果已经释放则返回nullptr 。 示例如下: #include
#include m_data, s.use_count());
} else {
fmt::print("useSimple freed!\n");
}
}
/*
construct...10
share_simple: 10 use_count:1
useSimple alive! m_data:10 use_count:2
destruct! 10
useSimple freed!
*/
int main(int argc, char **argv)
{
auto share_simple { make_shared(10) };
//访问类成员用->, 访问shared_ptr成员函数用.
fmt::print("share_simple: {} use_count:{}\n", share_simple->m_data, share_simple.use_count());
weak_ptr weak_simple { share_simple };
useSimple(weak_simple);
share_simple.reset();
useSimple(weak_simple);
return 0;
}
|