智能指针

19 篇文章 0 订阅

目录

智能指针的简单实现

shared_ptr

weak_ptr

unique_ptr


传统指针存在的问题
需要手动管理内存,容易发生内存泄露(忘记释放、出现异常等),释放之后产生野指针

智能指针的简单实现

template <typename T>
class SmartPointer {
private:
	T* m_obj;
public:
	SmartPointer(T* obj) :m_obj(obj) {}
	~SmartPointer() {
		if (m_obj == nullptr) return;

		delete m_obj;
	}

	T* operator->() {    //运算符重载 
		return m_obj;
	}
};
class Person {
	int m_age;
public:
	Person() {
		cout << "Person()" << endl;
	}
	Person(int age) :m_age(age) {
		cout << "Person(int)" << endl;
	}
	~Person() {
		cout << "~Person()" << endl;
	}
	void run() {
		cout << "run() - " << m_age << endl;
	}
};
int main()
{
	{
		SmartPointer<Person> p(new Person(20));
		p->run();
	}
	system("pause");
	return 0;
}

shared_ptr

多个shared_ptr可以指向同一个对象,当最后一个shared_ptr在作用域范围内结束时,对象才会被自动释放

原理

一个shared_ptr会对一个对象产生强引用(strong reference)
每个对象都有个与之对应的强引用计数,记录着当前对象被多少个shared_ptr强引用着
可以通过shared_ptr的use_count函数获得强引用计数
当有一个新的shared_ptr指向对象时,对象的强引用计数就会+1
当有一个shared_ptr销毁时(比如作用域结束),对象的强引用计数就会-1
当一个对象的强引用计数为0时(没有任何shared_ptr指向对象时),对象就会自动销毁(析构)

shared_ptr的循环引用

weak_ptr

weak_ptr会对一个对象产生弱引用
weak_ptr可以指向对象解决shared_ptr的循环引用问题(weak_ptr是用来解决shared_ptr相互引用时的死锁问题)

 

unique_ptr

unique_ptr也会对一个对象产生强引用,它可以确保同一时间只有1个指针指向对象
当unique_ptr销毁时(作用域结束时),其指向的对象也就自动销毁了
可以使用std::move函数转移unique_ptr的所有权

//ptr1强引用person对象
unique_ptr<Person> ptr1(new Person);
//转移之后,ptr2强引用person
unique_ptr<Person> ptr2 = std::move(ptr1);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值