Cpp学习笔记

 此为智能指针学习笔记:

智能指针:说白了就是个模板类,通过类的生命周期的自动结束效果,实现内存的主动释放。

也就是拿指针当对象去处理

此篇主要讨论:

    shared_ptr

该智能指针允许多个智能指针指向于同一个对象。它采用的是 引用计数器的方法,

每当多一个指针指向某一个对象时,指向该对象的所有智能指针内部引用数加一。

每当少一个指针指向某一个对象时,指向该对象的所有智能指针内部引用数减一。

当计数为0时会自动释放动态分配的内存。

 完整学习程序如下:

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

class MM
{
public:
	MM(string name, int age) :name(name), age(age){}
	~MM()
	{
		cout << " ~MM的析构函数 " << endl;
	}
	void print()
	{
		cout << name << "\t" << age << endl;
	}
protected:
	string name;
	int     age;
};

int main()
{
     //空的智能指针
	shared_ptr<int>  pInt;
	if (!pInt)
	{
		cout << "空的智能指针!" << endl;

	}
	//构造函数传参,创建堆区变量
	shared_ptr<int> pNum(new int(1000));
	//3.make_shared 来创建,这个函数的参数由你的构造函数的参数决定
	shared_ptr<int> pMake = make_shared<int>(1000);
	shared_ptr<MM> pMM = make_shared<MM>("lingLing", 19);  //这个函数2个参数,构造函数就需要两个参数
	/*
	   shared_ptr  的成员函数:
	   1.get() 函数   返回管理数据的内存指针,(指向管理的对象)
	   2.user_count  函数,统计引用智能指针管理对象的对象数
	   3.swap()  交换  
	   4.reset()   重新设置管理对象,
	
	*/
	{
		shared_ptr<MM> pmm(new MM("mn", 18));
		cout << "智能指针管理对象的地址: "<<pmm.get() << endl; //得到的是MM 的地址
		pmm.get()->print();
		cout << "count: " << pmm.use_count() << endl;
		shared_ptr<MM> pmm2(pmm);  //拷贝对象 (现在两个智能指针指向了同一个对象)
		cout << "count:" << pmm.use_count() << endl;
		cout << "count:" << pmm2.use_count() << endl;
		//
		// = 等号赋值,也相当于调用构造函数
		shared_ptr<MM> pmm3 = pmm;
		cout << "count:" << pmm.use_count() << endl;
		cout << "count:" << pmm2.use_count() << endl;
		//如果是单纯赋值的话。如下操作:
		shared_ptr<MM> pmm4;
		pmm4 = pmm;     //(调用了重载运算符了)
		cout << "count:" << pmm.use_count() << endl;
		cout << "count:" << pmm2.use_count() << endl;
		//此时以上指针都是指向同一个对象的;只要是指向于同一个对象,他的智能指针就会增加。

		//需要注意的问题:(举例子)
//		MM* p = pmm.get();  //得到一个智能指针(通过get 函数得到管理对象的地址)
//		delete p;           //手动释放
		//以上操作会导致内存的重复释放——导致析构问题。引发中断(因为智能指针也会去释放一个对象的内存)
		//所以在使用get()函数的时候一定不要做 delete 操作。

		shared_ptr<MM> pmm5;
		pmm5 = pmm;
		pmm5.reset();       //断开与管理对象的联系
		cout << "count--pmm5:" << pmm.use_count() << endl;
		//本来应该是增加一个,但是增加了又把它重置(干掉了)所以出来的会是4个
		//不信,那就再来
		pmm4.reset();
		cout << "把pmm4干掉!——只剩下了:" << pmm.use_count() << endl;
		//以上是不传参的reset()函数
		//还有一个传参情况的:
		pmm3.reset(new MM("王冰冰", 18));
		cout << "count: " << pmm.use_count() << endl;
		//关于智能指针成员函数的讲解。

	}

	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值