|
智能指针shared_ptr与weak_ptr的完美结合使用
类:默认是用智能指针管理的 在类的内部当需要将自己作为智能指针的时候可以传入过去 而不需要构造一个假的导致对象被析构
类要继承 : public std::enable_shared_from_this<类名> {}
使用: this.shared_from_this() 本质是将weak_ptr转为shared_ptr
class GR_RUNTIME_API basic_block : public msg_accepter,
public boost::enable_shared_from_this<basic_block>
- #include <iostream>
- #include <memory>
- class Object{
- public:
- Object(int id) : m_id(id) {}
- int m_id;
- ~Object(){
- printf("对象id=%d析构了!\n", m_id);
- }
- };
- void shared_ptr_with_weak_ptr(){
- typedef std::shared_ptr<Object> ObjectPtr;
- ObjectPtr obj(new Object(1));
- // 弱指针,我可能管理了资源 也可以没有管理资源
- // 当外部被shared_ptr管理的时候 weak_ptr就是有效的,否则无效
- // 有效或无效 完全依赖于外部的智能指针shared_ptr的 weak_ptr相当于一个监听者
- typedef std::weak_ptr<Object> Object_weak_ptr;
- Object_weak_ptr weak_obj(obj); //一般通过shared_ptr来构建weak_ptr
- Object_weak_ptr weak_obj2(obj); // 并不影响引用的次数 因为你是弱的
- printf("强弱智能指针对比:use_count()=%ld,%ld\n", obj.use_count(), weak_obj.use_count());
- {
- //如何使用weak_ptr 调用lock()方法
- //返回的:如果weak_ptr有效则会创建一个新的shared_ptr 否则为nullptr
- // 如果有效 相当于从weak_ptr转换为shared_ptr 从弱变强了
- auto p = weak_obj.lock();
- if (p)
- {
- printf("有效,p当成shared_ptr来使用,use_count()=%ld,%ld\n", p.use_count(), weak_obj.use_count());
- /* weak_ptr是有效的 外部有其他shared_ptr也管理同一份资源 */
- }
- else
- {
- /* weak_ptr是无效的 */
- }
- // 注意细节:放语句块里 会自动析构p的
- }
- printf("析构p后恢复了:use_count()=%ld,%ld\n", obj.use_count(), weak_obj.use_count());
- //obj.reset(); //shared_ptr脱离关系
- obj.reset(new Object(2)); //先脱离 后创建一个新对象 不是同一份资源了 同时导致Object(1)析构 因为use_count=0了
- printf("脱离关系之后的:\n");
- {
- auto p2 = weak_obj.lock();
- if (p2)
- {
- printf("有效,p2当成shared_ptr来使用,use_count()=%ld\n", p2.use_count());
- /* weak_ptr是有效的 外部有其他shared_ptr也管理同一份资源 */
- }
- else
- {
- printf("已经脱离关系了,weak_ptr是无效的,由弱转强失败了!\n");
- }
- }
- weak_obj = obj; // 用一个强指针去赋值给弱指针
- printf("又让强弱智能指针管理同一份资源之后的:\n");
- {
- auto p2 = weak_obj.lock();
- if (p2)
- {
- printf("有效,p2当成shared_ptr来使用,use_count()=%ld,%ld\n", p2.use_count(), weak_obj.use_count());
- /* weak_ptr是有效的 外部有其他shared_ptr也管理同一份资源 */
- }
- else
- {
- printf("已经脱离关系了,weak_ptr是无效的,由弱转强失败了!\n");
- }
- }
- printf("析构p2后恢复了:use_count()=%ld,%ld\n", obj.use_count(), weak_obj.use_count());
- //如何通过weak_ptr判断外部是否有被shared_ptr管理的资源 不想通过weak_obj.lock()去创建一个新的shared_ptr
- if(weak_obj.expired()){
- printf("weak_ptr是无效的!\n");
- }else{
-
- printf("该weak_ptr有被外部其他shared_ptr管理!\n");
- }
- }
- int main(){
- printf("智能指针shared_ptr与weak_ptr的完美结合使用.cpp\n");
- // 极大的减少了内存泄露风险
- shared_ptr_with_weak_ptr();
- return 0;
- }
复制代码
|
|