智能指针内容整理

本文介绍了C++智能指针的作用和类型,如避免内存泄漏的shared_ptr、unique_ptr和weak_ptr。重点讲解了shared_ptr的引用计数、make_shared的使用、this指针问题、循环引用解决方案以及智能指针与裸指针的使用注意事项。
摘要由CSDN通过智能技术生成

智能指针这个东西想必学过C++的人都应该听说过或者使用过,但是应该有一些人和我一样对其只有一点浅显的认识,今天查了一些关于智能指针的资料,下面对其做一些整理:

为什么要有智能指针
在用C++动态内存分配的时候,使用new操作获取了一块内存,那么一定要在合适的地方将其delete掉,否则就会造成内存泄漏,这一点都明白,但是实际操作的时候总是会忘记这个delete操作,而智能指针就是为了避免这样一个问题。智能指针通常都是一个类,它包含一个指针成员p,这个指针指向new得到的内存块,最简单的智能指针会在自己的析构函数处调用delete p以实现自动delete。

C++11中智能指针包括四种:auto_ptr、weak_ptr、shared_ptr、unique_ptr,其中auto_ptr就是上面所说的那样一种最简单的智能指针,但是它存在很大的缺陷:当有两个不同的auto_ptr指向相同的一块内存的时候,由于auto_ptr在析构的时候会delete掉内存块,那么这两个auto_ptr必然会按先后顺序对这块内存做delete,也就是说一块内存会被delete两次,这会导致很严重的后果。因此通常是不考虑使用auto_ptr的,后面的讨论也不会涉及到auto_ptr。

shared_ptr
为了避免auto_ptr的问题,shared_ptr采用引用计数的方法,当一个shared_ptr指向一块内存的时候,这块内存的引用计数就会+1;当一个shared_ptr的作用域结束的时候,这块内存的引用计数就会-1。当内存的引用变为0的时候才会去调用delete方法,看一个具体的例子:

#include <memory>
#include <iostream>
using namespace std;

class A
{
public:
	A() { cout << " Create A ! " << endl;  };
	~A() { cout << " Delete A ! " << endl; }; 
};

void Test( shared_ptr<A> p2 )
{
	shared_ptr<A> p1( p2 );
}

int main()
{
	shared_ptr<A> p(new A);
	Test(p);
	cout << " Test Finished ! " << endl;
	return 0;
}

它的输出结果为:
在这里插入图片描述
可以看到在Test结束之后,p1就被销毁掉了,但是此时还并没有对A做delete,因为在main函数中还有一个p享有A的内存,只有在p也被销毁之后,才会对A做delete。
对于shared_ptr的使用有一些需要注意的地方:
1.shared_ptr的初始化问题:从上面就可以看出shared_ptr可以通过一个裸指针或者另一个shared_p

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值