什么是智能指针
是C++的一个类模板,用对象去管理指针,想一想之前在使用指正的过程中,经常会出现内存泄漏和内存多次释放的问题,而智能指针使我们在项目开发中代替了C语言中原生的指针,保证开发更安全,更高效。例如 boost库的智能指针
为什么要使用智能指针
智能指针就是用来管理一个指针,在使用指针的过程中我们都遇到过,指针导致的内存泄漏和内存的多次释放,而智能指针可以很大程度上避免这些问题,它本身就是一个类,而类的特性就是在执行完时,超出了类的作用域,会自动调用析构函数自动释放资源。也就是说智能指针会在函数结束时自动释放内存空间,避免了手动释放内存带来的弊端。
智能指针有两种分类:(这个后面再详细分析)
1.不带引用计数的智能指针
2.带引用计数的智能指针
指针的思想
工程中的智能指针是一个类模板
通过构造函数接管申请的内存
通过析构函数确保堆内存被及时释放
通过重载指针运算符 * 和 ->来模拟指针的行为
通过重载比较运算符 == 和 != 来模拟指针的比较。
简单实现智能指针类
#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
class Test
{
public:
Test(int a)
{
this->m_a = a;
}
void PrintVal()
{
cout << "a = " << m_a << endl;
}
private:
int m_a;
};
class MyTestPointer
{
public:
MyTestPointer()
{
this->p = NULL;
cout << "无参构造函数" << endl;
}
MyTestPointer(Test *p)
{
this->p = p;
cout << "有参构造函数" << endl;
}
~MyTestPointer()
{
delete p;
cout << "析构函数" << endl;
}
Test* operator->()
{
return p;
}
Test &operator*()
{
return *p;
}
private:
Test *p;
};
void PlayObj()
{
Test *p = new Test(10);
p->PrintVal();
delete p;
MyTestPointer t = new Test(20);
t->PrintVal();
}
int main()
{
PlayObj();
system("pause");
return 0;
}
执行结果:
简单分析一下,我们主要了解一下智能指针的思想。
//1
Test *p = new Test(10);
p->PrintVal();
delete p;
//2
MyTestPointer t = new Test(20);
t->PrintVal();
1)是指针的一般用法,先使用指针申请一个类对象的堆内存,使用完之后我们必须手动delete释放掉这个内存空间,确保内存泄漏。2)是智能指针的现实用法,不用去考虑内存问题,放心大胆的申请堆内存,当执行完成时,类会自动回收内存空间。是不是更方便和安全了。这就是智能指针的思想。
了解过泛型编程之后可以动手实现一个简易的智能指针类模板。期待!!!
上面是一个指向类类型的指针,下面试着做一个指向int类型的指针。
#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
class Test
{
public:
Test(int a)
{
this->m_a = a;
}
void PrintVal()
{
cout << "a = " << m_a << endl;
}
private:
int m_a;
};
class MyIntPointer
{
public:
MyIntPointer()
{
this->p = NULL;
cout << "无参构造函数" << endl;
}
MyIntPointer(int *p)
{
this->p = p;
cout << "有参构造函数" << endl;
}
~MyIntPointer()
{
delete p;
cout << "析构函数" << endl;
}
int *operator->()
{
return p;
}
int &operator*()
{
return *p;
}
private:
int *p;
};
void PlayObj()
{
int *p = new int(10);
cout << "a = " << *p << endl;
delete p;
MyIntPointert = new int(20);
cout << "a = " << *t << endl;
}
int main()
{
PlayObj();
system("pause");
return 0;
}
执行结果: