文章目录
一、简介
C++智能指针解决用户在堆区申请的内存空间忘记释放而造成内存泄漏的问题。C++将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。
二、简易版的自己实现的智能指针
#include <iostream>
using namespace std;
/*方便测试的类*/
class Person
{
public:
Person()
{
cout << "Person" << endl;
}
~Person()
{
cout << "~Person" << endl;
}
void Test01(void )
{
cout << "Test01" << endl;
}
};
/*简易版的智能指针类*/
template <typename T>
class My_ptr
{
public:
explicit My_ptr(T *p)
{
this->m = p;
}
~My_ptr()
{
if (this->m != nullptr)
delete m;
this->m = nullptr;
}
T *&operator->()
{
return m;
}
private:
T *m = nullptr;
};
int main()
{
{
My_ptr<Person> ps(new Person());
ps->Test01();
}
return 0;
}
//输出
Person
Test01
~Person
三、C++智能指针分类
STL一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr和weak_ptr
模板auto_ptr是C++98提供的解决方案,C+11已将将其摒弃。尽量不使用
0、使用智能指针的注意点
- ①、显示的创建智能指针对象,不能隐式的将一个指针转换为智能指针
- ②、对于所有智能指针应避免使智能指针对象指向栈对象
int a = 5;
auto_ptr<int> p(&a); //error
auto_ptr<int> p(new int(10)); //ok
int *b = new int(5);
auto_ptr<int> p(b); //ok
1、auto_ptr
auto_ptr为C++98的方案,C++11以后不建议使用。
基本用法
auto_ptr<Person> a1