shared_ptr原理和使用

一、原理

为了避免new了对象后忘记delete,或者对象的销毁时机不确定,通过shared_ptr可以自动销毁没有被引用的对象。

二、注意点

shared_ptr并不能解决循环引用的问题,如果有循环引用,不能自动delete指向的对象。
shared_ptr 线程不安全

三、测试

#pragma once
#include <memory>
#include <iostream>
using namespace std;
class SharedPtrClass
{
public:
	
	int a;
	bool sharedPtr;
	shared_ptr<SharedPtrClass> t;
	SharedPtrClass(bool sharedPtr)
	{
		this->sharedPtr = sharedPtr;
		cout << "SharePrtClass new" << (sharedPtr?" sharedPtr":" class")<< endl;
	}
	~SharedPtrClass()
	{
		cout << "SharePtrClass free " << (sharedPtr?" sharedPtr":" class") << endl;
	}
};
class SharedPtr
{
public:

	void doTest()
	{
		cout << "autoDelete before" << endl << endl;
		autoDelete();
		cout << "autoDelete exit" << endl << endl;

		cout << endl << endl << endl;

		cout << "circularRef before" << endl << endl;
		circularRef();
		cout << "circularRef exit" << endl << endl;
		

	}
	void autoDelete()
	{
		cout << "autoDelete class start1" << endl;

		SharedPtrClass* a = new SharedPtrClass(false); //没有主动delete,函数退出时,并不会a指向的对象,导致内存泄漏
		cout << "autoDelete class end1" << endl;
		cout << endl;

		cout << "autoDelete shared_ptr start2" << endl;
		shared_ptr<SharedPtrClass> b(new SharedPtrClass(true)); //智能指针在函数退出时,计数变0,从而析构指向的对象
		cout << "autoDelete shared_ptr end2" << endl;
		cout << endl;
	
	}
	void circularRef()
	{
		cout << "circularRef start1" << endl;
		shared_ptr<SharedPtrClass> a(new SharedPtrClass(true));
		shared_ptr<SharedPtrClass> b(new SharedPtrClass(true));
		a->t = b;
		b->t = a;//循环引用,不能自动delete,导致内存泄漏,如果去掉这行,两个对象都能delete
		cout << "circularRef end1" << endl;
		cout << endl;

	}
	
};

四、输出

autoDelete before

autoDelete class start1
SharePrtClass new class
autoDelete class end1

autoDelete shared_ptr start2
SharePrtClass new sharedPtr
autoDelete shared_ptr end2

SharePtrClass free sharedPtr
autoDelete exit

circularRef before

circularRef start1
SharePrtClass new sharedPtr
SharePrtClass new sharedPtr
circularRef end1

circularRef exit

shared_ptr是C++11中引入的一种智能指针,用于管理动态分配的内存。它使用引用计数来跟踪有多少个shared_ptr共享相同的指针,并在没有任何引用时自动释放内存。当创建一个shared_ptr时,它会从一个裸指针中获取所有权,并将一个引用计数加1。当一个shared_ptr被析构或者赋值给另一个shared_ptr时,引用计数减1。当引用计数为0时,shared_ptr会自动删除它所拥有的指针并释放内存。这种方式避免了手动管理内存的麻烦内存泄漏的可能性。 另外,shared_ptr还支持共享相同指针的功能,即多个shared_ptr对象可以指向同一个动态分配的内存。这可以通过复制构造函数赋值运算符来实现。当一个shared_ptr复制给另一个shared_ptr时,引用计数会增加。当其中一个shared_ptr被析构或者赋值给另一个shared_ptr时,引用计数减少。只有当所有shared_ptr都被析构或者赋值给其他对象时,引用计数才会为0,从而释放内存。 此外,为了避免循环引用导致的内存泄漏,可以使用weak_ptrshared_ptr组合来解决。可以将循环引用中的一个对象改为weak_ptr,另一个对象仍使用shared_ptr。weak_ptr不会增加引用计数,只是提供对shared_ptr所管理的对象的临时访问权限。这样,当所有shared_ptr都被析构时,weak_ptr将被置为空,避免了循环引用导致的内存泄漏。 综上所述,shared_ptr原理使用引用计数来管理动态分配的内存,并支持共享相同指针的功能。它在内存管理避免内存泄漏方面提供了便利安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值