21xrx.com
2024-11-05 19:27:53 Tuesday
登录
文章检索 我的文章 写文章
C++中的weak_ptr使用和lock操作
2023-07-05 09:59:18 深夜i     --     --
C++ weak_ptr 使用 lock操作

C++中的weak_ptr是一个智能指针,使用它可以避免指针悬空或者引起程序异常。它与shared_ptr和unique_ptr一起构成了C++的智能指针家族。

weak_ptr和shared_ptr的使用方式类似,在使用时也需要将一个对象或者指针作为参数传入构造函数。但是weak_ptr不将该对象或指针的引用计数加1,而是通过一个额外的计数器来记录这个对象是否被释放。weak_ptr的构造函数只是将一个shared_ptr对象的引用传入,表示这个weak_ptr指向的对象与该shared_ptr共享的内存空间。

使用weak_ptr的主要作用是,避免在没有有效指针的情况下释放对象,这种情况称之为悬空指针。当我们需要在某个地方访问一个对象时,可以先使用lock方法将weak_ptr转换为对应的shared_ptr对象,然后对该shared_ptr进行访问。

lock方法接收一个weak_ptr作为参数,并返回一个对应的shared_ptr。如果该weak_ptr所指向的对象还未被释放,则返回一个有效的shared_ptr并且其引用计数加1。如果该weak_ptr所指向的对象已经被释放,则返回一个空shared_ptr。

以下是使用weak_ptr和lock的示例代码:


#include <memory>

#include <iostream>

class MyClass {

public:

  MyClass() std::cout << "MyClass Constructor." << std::endl;

  ~MyClass() std::cout << "MyClass Destructor." << std::endl;

};

int main() {

  std::shared_ptr<MyClass> shared = std::make_shared<MyClass>();

  std::weak_ptr<MyClass> weak(shared);

  std::shared_ptr<MyClass> shared2 = weak.lock();

  if (shared2)

    std::cout << "shared2 is valid." << std::endl;

   else

    std::cout << "shared2 is empty." << std::endl;

  

  shared.reset();

  shared2.reset();

  std::shared_ptr<MyClass> shared3 = weak.lock();

  if (shared3)

    std::cout << "shared3 is valid." << std::endl;

   else

    std::cout << "shared3 is empty." << std::endl;

  

  return 0;

}

在这个示例中,我们先创建了一个shared_ptr对象shared,它指向MyClass类的一个实例。然后,我们又创建了一个weak_ptr对象weak,它指向shared所指向的对象。接下来,我们调用了weak的lock方法,将其转换成一个shared_ptr对象shared2,并且判断shared2是否有效。

由于此时shared还指向该对象,因此,shared2是有效的。接着,我们将shared释放,继而将shared2释放,随后再调用lock方法,将weak转换为shared_ptr对象shared3。但是由于该对象已被释放,因此返回的shared3是一个空shared_ptr。

总结起来,使用weak_ptr和lock方法可以更加安全和方便地指向内存空间,避免悬空指针和程序异常的产生。但是,需要注意的是,weak_ptr并不会对所指对象的生命周期及时进行管理,如果程序中出现不当的使用操作,仍可能会造成内存泄漏和程序崩溃等问题。因此,在使用时需要特别谨慎。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复