首页 > 其他分享 >智能指针补—weak_ptr

智能指针补—weak_ptr

时间:2023-06-11 19:03:18浏览次数:43  
标签:对象 weak value pb shared ptr 指针

本次主要是补充一下智能指针章节的遗漏部分——weak_ptr指针

       weak_ptr是C++11中引入的一种智能指针,它的作用就是配合shared_ptr对资源进行管理。由于weak_ptr设计的作用就是配合shared_ptr,因此其是一种“弱引用”,本身并不会增加所指对象的引用计数,也不会影响所指对象的生命周期。

       weak_ptr通常用于解决shared_ptr的循环引用问题。当两个或者更多shared_ptr互相引用时,会形成一个循环引用,类似死锁的一种产生方式,此时会导致所指向对象无法被释放,从而产生内存泄漏。这时我们可以使用weak_ptr破除循环引用,将其中一个shared_ptr转换为weak_ptr,使得它不在持有该对象的所有权,从而避免内存泄漏。

       使用weak_ptr时,需要用到weak_ptr中lock()函数,该函数可以获取一个shared_ptr对象,如果此时weak_ptr指向的对象已经被销毁,lock函数会返回一个空的shared_ptr对象。

下面给出一个使用weak_ptr的示例:

class B {
public:
	B(int value) : value_(value)
	{}
	int getValue() const
	{
		return value_;
	}
private:
	int value_;
};
class A {
public:
	void setB(shared_ptr<B> b) 
	{ 
		pb_ = b; 
	}
	void doSomething() 
	{
		if (auto p = pb_.lock())//看shared_ptr对象是否被销毁
			cout << "A::doSomething() called, B's value is " << p->getValue() << endl;
		else 
			cout << "B has been deleted" << endl;
	}
private:
	weak_ptr<B> pb_;
};
int main() {
	shared_ptr<A> pa = make_shared<A>();//先创建对象A和B
	shared_ptr<B> pb = make_shared<B>(42);
	pa->setB(pb);//将对象B传递给A(这里使用weak_ptr传递)
	pa->doSomething();
	pb.reset();//对B对象计数器--,变为0,直接销毁
	pa->doSomething();
	return 0;
}

此时输出结果:

智能指针补—weak_ptr_智能指针

以上就是weak_ptr的基本使用方法,也是为了补充上章没有总结到的一些知识点。

标签:对象,weak,value,pb,shared,ptr,指针
From: https://blog.51cto.com/u_15209404/6458553

相关文章

  • C++ 指针
    一、C++指针的算术运算递增一个指针我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素:实例#include<iostream>usingnamespacestd;constintMAX=3;intmain()......
  • 力扣977题(双指针)
    所用算法:双指针观察题目的规律,平方之后该数组两边的数大,中间的数小,因此想到双指针,一个指针指向数组的开头,一个指针指向数组的结尾。如果你觉得在原数组上操作会将未遍历的元素覆盖掉,那么一定要开辟一个新的数组,将原数组的值赋给新的数组。(比如一个数组平方之后的数组是{......
  • C语言的指针
    1.初步理解指针C语言的指针指的是一个地址,也是内存单元的编号,它存储的是内存地址.#include<stdio.h>intmain(){//初始化一个变量a的值inta=10;//定义一个指针p指向变量a的地址,int*表示这个变量存放的是int类型的地址int*p=&a;//打印这个指针所指向的变量......
  • C++面试八股文:指针占用多少个字节?
    C++面试八股文:指针占用多少个字节?某日小二参加XXX科技公司的C++工程师开发岗位4面:面试官:memset、memcpy和strcpy的区别是什么?小二:memset用于将一块内存设置为特定的值,memcpy用于将一块内存从一个位置复制到另一个位置,strcpy用于将一个字符串从一个位置复制到另一个位......
  • 在 c++ 中删除一个 NULL pointer (空指针)
    @is21201.在c++中删除一个NULLpointer(空指针)是安全的2.标准中相关内容如下:"Ineitheralternative,ifthevalueoftheoperandofdeleteisthenullpointertheoperationhasnoeffect."3.一个有用的宏@is2120#definemy_delete(x){deletex;x=NULL;} 4......
  • ptr->a()和 (*ptr).a()有何不同
    标准中对于类成员访问有如下说明:3IfE1hasthetype“pointertoclassX,”thentheexpressionE1->E2isconvertedtotheequivalentform(*(E1)).E2;即对于指向classX类型的指针,E1->E2会被转化成等价的形式(*(E1)).E2,那么对于编译器而言会产生相同的代码,对于机器而言就......
  • boost库之智能指针
    一、boost::scoped_ptrboost::scoped_ptr是Boost库中的一个智能指针类,用于管理动态分配的对象,并确保在超出作用域时自动释放资源。boost::scoped_ptr提供了一种简单而安全的方式来管理对象的生命周期。它的行为类似于C++原始指针,但它负责在其生命周期结束时自动调用delete来释放......
  • 下标,指针,迭代器
    1//使用下标遍历数组中的元素2inta[4]={1,2,3,4};3for(size_ti=0;i<4;++i)4{5cout<<a[i]<<endl;6}1//使用下标任意访问数组中某个元素2inta[4]={1,2,3,4};3cout<<a[1]<<endl;1//使用指针访问遍历数组中......
  • C++ 指针
    一、什么是指针?1、指针是一个变量,其值为另一个变量的地址2、double*类型是一种指针类型,用于指向double类型的内存地址3、指针的值都是代表内存地址的十六进制数二、C++中使用指针实例#include<iostream>usingnamespacestd;intmain(){intvar=20;/......
  • C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?
    C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?某日小二参加XXX科技公司的C++工程师开发岗位2面:面试官:指针、引用、解引用和取地址是C++中的重要概念,请问它们在语法和语义上有所不同?小二:指针是一个变量,它存储了一个内存地址。小二:引用是一个别名,它允许使用一个......