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

C++三种 智能指针 的常见使用方法(shared

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

C++三种 智能指针 的常见使用方法(shared

C++的三类智能指针,shared_ptr, weak_ptr, unique_ptr

第一类:shared_ptr;

#include
#include
using namespace std;
class MM {
public:
	MM(string name,int age):name(name),age(age){}
	string& getname() {
		return name;
	}
	int& getage() {
		return age;
	}
private:
	string name;
	int age;
};
class TestData {
public:
	TestData() {
		cout << "构造函数!n";
	}
	~TestData() {
		cout << "析构函数!n";
	}
};

//文件指针删除器
void closeFile(FILE* file) {
	cout << "文件指针释放成功!n";
	fclose(file);
}
int main() {
	shared_ptrptr;
	if (!ptr) {
		cout << "智能指针为空!n";
	}
 //2。构造函数传参的绑定一个堆区变量。
	shared_ptrPtr(new int(100));
	cout << *Ptr << endl;
	shared_ptrtmp(new MM("江涛", 20));
	cout << tmp->getname() << tmp->getage();
	//3.make_shared来构建,这个函数的参数由构造函数的参数决定,
	shared_ptrpMake=make_shared(1);
	shared_ptrpMm=make_shared("MM",18);
 
 //4.shared_ptr主要成员函数
 
	{
		shared_ptrpmm(new MM("MM", 18));
		
		//可以直接把对象当成指针来用
		pmm->getname();
		(*pmm).getname();
		cout << "智能指针管理对象的地址:" << pmm.get() << endl;
		cout<getname()<<' '<getage()<pmm2(pmm);
		cout << "count:" << pmm.use_count() << endl;
		cout << "count:" << pmm2.use_count() << endl;
		shared_ptrpmm3 = pmm;
		cout << "count:" << pmm.use_count() << endl;
		cout << "count:" << pmm3.use_count() << endl;
		shared_ptrpmm4;
		pmm4 = pmm;
		cout << "count:" << pmm.use_count() << endl;
		cout << "count:" << pmm4.use_count() << endl;
		pmm4.reset();	//断开与管理对象联系
		cout << "count:" << pmm.use_count() << endl;
		pmm3.reset(new MM("慧姐", 19));
		cout << "count:" << pmm.use_count() << endl;
	}

	
	
	//注意:智能指针管理能够直接delete内存变量,如果要经过特殊方式释放内存,那么需要自己手动写删除器。
	//1.对象数组
	{
		cout << "对象数组:n";
	//	shared_ptrp(new TestData[10]);//直接这样会报错,因为智能指针只能析构一次,这里需要析构十次
		shared_ptrpp(new TestData[10], [](TestData* pp) {delete[] pp; });
	}
	//2.文件指针
	{
		shared_ptrpf(fopen("1.txt","w+"), closeFile);
	}
	return 0;
}

第二类:weak_ptr

*
	weak_ptr只能从shared_ptr或者weak_ptr构造而来
	3.主要用途是为了解决shared_ptr循环引用导致的内存未被释放问题
	注意点:
		不可以使用*或者->访问对象
		weak_ptr不会造成计数的改变*/
#include
#include
#include
using namespace std;
class B;
class A {
public:
	A() {
		cout << "A" << endl;
	}
	~A() {
		cout << "~A" << endl;
	}
//protected:
	//shared_ptrb; //会引发循环
	weak_ptrb;//这样就不会
};
class B
{
public:
	B() {
		cout << "B" << endl;
	}
	~B() {
		cout << "~B" << endl;
	}
//protected:
	//shared_ptra; //会引发循环
	weak_ptra;//这样就不会
};

int main() {
	//weak_ptrpInt(new int(100));错误
	{
		shared_ptrpShare(new int(100));
		cout << "count:" << pShare.use_count() << endl;
		weak_ptrpWeak(pShare);
		cout << "count:" << pWeak.use_count() << endl;
		weak_ptrpWeak2(pShare);
		cout << "count:" << pWeak2.use_count() << endl;
		pWeak2.reset();
		cout << "count:" << pWeak2.use_count() << endl;
		shared_ptrtemp = pWeak.lock();
		cout << *temp.get() << endl;
	}

	cout << "循环引用问题:" << endl; {
		shared_ptraObject = make_shared();
		shared_ptrbObject = make_shared();
		cout << aObject.use_count() << endl;
		cout << bObject.use_count() << endl;
		aObject->b = bObject;
		bObject->a = aObject;
		cout << aObject.use_count() << endl;
		cout << bObject.use_count() << endl;

	}

	return 0;
}

第三类:unique_ptr

#include
using namespace std;
class MM {
public:
	MM(int Num) :Num(Num) {
		cout << "MM成功!n";
	}
	int getNum() {
		return Num;
	}
private:
	int Num;
};
int main() {
	 //1.注意不能使用拷贝构造和拷贝赋值
	unique_ptrpMM(new int(100));
	
	 //2.1采用move语句转交所有权
	unique_ptrptr(move(pMM));
	cout << "value:" << *ptr;
	cout << "value:" << pMM.get()<ptr2;
	ptr2 = move(ptr);
	cout << "value:" << *ptr2 << endl;
	cout << "value:" << ptr.get() << endl;
	//采用2.2reset结合release函数的方式转交所有权
	unique_ptrpData(new MM(10086));
	cout << pData->getNum()<pData2;
	pData2.reset(pData.release());//转交所有权
	cout << pData2->getNum()<getNum() << endl;
	
	return 0;
}
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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