C++11 智能指针学习

1. shared_ptr 学习

1.1 shared_ptr 定义方法

先定义空指针,再定义指向内容;

std::shared_ptr<int> p1 = std::make_shared<int>();
	*p1 = 78;

用在类中:

std::shared_ptr<class> p1 = std::make_shared<class>();
	*p1 = new class();

定义指针时新构建类

shared_ptr<class>p1=make_shared<class>(new class());

定义指针来指向旧指针指向的类

shared_ptr<A> pointer2 = pointer;

查看计数

pointer.use_count()

1.2 实验

#include <iostream>
#include  <memory> // 需要包含这个头文件

using namespace std;
class A//定义一个类
{
public:
	int A_i = 0;
	A() {
		cout << "A" <<endl;
	}
	A(int i) {
		A_i = i;
		cout << "A" << i << endl;
	}
	~A() {
		cout << A_i<<"~A" << endl;
	}

private:

};
void test(shared_ptr<A> &pointer) {
	shared_ptr<A> pointer3 = pointer;
	cout << "test" << endl;
	cout << pointer.use_count() << endl;
	cout << "test end" << endl;
}
void test1(shared_ptr<A> pointer) {//是否引用有区别
	shared_ptr<A> pointer3 = pointer;
	cout << "test1" << endl;
	cout << pointer.use_count() << endl;
	cout << "test1 end" << endl;
	
}
void test2() {
	shared_ptr<A> pointer4(new A(4));
	cout << pointer4.use_count() << endl;

}

int main()
{
	shared_ptr<A> pointer(new A());//定义智能指针



	cout << pointer.use_count() << endl;

	std::shared_ptr<A> pointer2 = pointer;
	cout << pointer.use_count() << endl;
	test(pointer);
	cout << pointer2.use_count() << endl;
	test1(pointer);
	cout << pointer2.use_count() << endl;



	std::shared_ptr<A> pointer5(new A(2));

	cout << pointer5.use_count() << endl;

	test2();
	cout << "test2 end" << endl;
	return 0;
}


在这里插入图片描述

2 unique_ptr

独占指针;

#include <iostream>
#include <memory>

struct Task {
	int mId;
	Task(int id) :mId(id) {
		std::cout << "Task"<<mId<<"Constructor" << std::endl;
	}
	~Task() {
		std::cout << "Task" << mId << "::Destructor" << std::endl;
	}
};

int main()
{
	// 空对象 unique_ptr
	std::unique_ptr<int> ptr1;

	// 检查 ptr1 是否为空
	if (!ptr1)
		std::cout << "ptr1 is empty" << std::endl;

	// 检查 ptr1 是否为空
	if (ptr1 == nullptr)
		std::cout << "ptr1 is empty" << std::endl;

	// 不能通过赋值初始化unique_ptr
	// std::unique_ptr<Task> taskPtr2 = new Task(); // Compile Error

	// 通过原始指针创建 unique_ptr
	std::unique_ptr<Task> taskPtr(new Task(1));

	// 检查 taskPtr 是否为空
	if (taskPtr != nullptr)
		std::cout << "taskPtr is  not empty" << std::endl;

	// 访问 unique_ptr关联指针的成员
	std::cout << taskPtr->mId << std::endl;

	std::cout << "Reset the taskPtr" << std::endl;
	// 重置 unique_ptr 为空,将删除关联的原始指针
	taskPtr.reset();

	// 检查是否为空 / 检查有没有关联的原始指针
	if (taskPtr == nullptr)
		std::cout << "taskPtr is  empty" << std::endl;

	// 通过原始指针创建 unique_ptr
	std::unique_ptr<Task> taskPtr2(new Task(2));

	if (taskPtr2 != nullptr)
		std::cout << "taskPtr2 is  not empty" << std::endl;

	// unique_ptr 对象不能复制
	//taskPtr = taskPtr2; //compile error
	//std::unique_ptr<Task> taskPtr3 = taskPtr2;
     
	{
		// 转移所有权(把unique_ptr中的指针转移到另一个unique_ptr中)
		std::unique_ptr<Task> taskPtr4 = std::move(taskPtr2);
		// 转移后为空
		if (taskPtr2 == nullptr)
			std::cout << "taskPtr2 is  empty" << std::endl;
		// 转进来后非空
		if (taskPtr4 != nullptr)
			std::cout << "taskPtr4 is not empty" << std::endl;

		std::cout << taskPtr4->mId << std::endl;

		//taskPtr4 超出下面这个括号的作用于将delete其关联的指针
	}//大括号代表一个作用域;

	std::unique_ptr<Task> taskPtr5(new Task(3));

	if (taskPtr5 != nullptr)
		std::cout << "taskPtr5 is not empty" << std::endl;

	// 释放所有权
	Task * ptr = taskPtr5.release();

	if (taskPtr5 == nullptr)
		std::cout << "taskPtr5 is empty" << std::endl;

	std::cout << ptr->mId << std::endl;

	delete ptr;

	return 0;
}

3.weak_ptr

std::weak_ptr 用于观察 std::shared_ptr 所指向的对象,通过 weak_ptr 就可以得知对应的 shared_ptr 是否已经被销毁。

weak_prt简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值