栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

智能指针的种类以及使用场景

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

智能指针的种类以及使用场景

智能指针的种类以及使用场景

踩内存: 由于指针在使用的之前又被释放掉,那么这块内存很有可能又被分配出去了。参考踩内存

	char* p = (char* )malloc(6);
	strcpy(p, "hello");
	free(p);  //当指针p释放内存后,该内存以后可以被存储其他数据
}

free函数就是把这块内存和 p 之间的所有关系斩断,从此 p 和那块内存之间再无瓜葛。至于指针变量p本身保存的地址并没有改变,但是它对这个地址处的那块内存却已经没有所有权了。那块被释放的内存里面保存的值也没有改变,只是再也没有办法使用了。

shared_ptr 使用规范

暴露裸指针:

#include 
#include 

using namespace std;

int main() {
	int *p = new int();
	shared_ptr sp = shared_ptr(p);  //暴露了裸指针
	shared_ptr sp = shared_ptr(new int);  //隐藏了裸指针
	
	shared_ptr sp = make_shared(); //其中维护了弱引用技术 
	int *p = sp.get();  //避免使用get方式获取指针
}

智能指针管理的对象将自身返回:

class T : public enable_shared_from_this {
public:
	shared_ptr self() {
		return enable_shared_from_this();
	}
};
unique_ptr 使用规范
//此方式返回是可以的
#include 
#include 

using namespace std;

class T {};

unique_ptr get_unique() {
	unique_ptr up;
	return up;
}

int main() {

	unique_ptr = get_unique();

	return 0;
}
}
weak_ptr解决循环引用问题

循环引用

#include 
#include 

using namespace std;

class B;
class A {
public:
	~A() {
		cout << "A::~A()" << endl;
	}

	shared_ptr spb;
};

class B {
public:
	~B() {
		cout << "B::~B()" << endl;
	}

	shared_ptr spa;
};

int main() {
	shared_ptr sp1 = make_shared();
	shared_ptr sp2 = make_shared();
	sp1->spb = sp2;
	sp2->spa = sp1;

	cout << "A.use_count():" << sp1.use_count() 
		 << " B.use_count():" << sp2.use_count() << endl;
	return 0;
}
//代码运行结果:A.use_count():2 B.use_count():2

利用weak_ptr解决

#include 
#include 

using namespace std;

class B;
class A {
public:
	~A() {
		cout << "A::~A()" << endl;
	}
	weak_ptr spb;
};

class B {
public:
	~B() {
		cout << "B::~B()" << endl;
	}
	weak_ptr spa;
};

int main() {
	shared_ptr sp1 = make_shared();
	shared_ptr sp2 = make_shared();
	sp1->spb = sp2;  //使用了weak_ptr后,在持有的过程中不会增加应用计数
	sp2->spa = sp1;  //使用了weak_ptr后,在持有的过程中不会增加应用计数

	cout << "A.use_count():" << sp1.use_count() << "  B.use_count():" << sp2.use_count() << endl;
	return 0;
}

代码运行结果

A.use_count():1  B.use_count():1
B::~B()
A::~A()
先构造类A对象,在构造类B对象,析构先析构B对象在析构A对象

将引用计数降为 1 ,且调用了各自析构函数。辅助 shared_ptr,用来解决 shared_ptr 循环引用,原理弱引用不占强引用计数

充电站
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号