智能指针

一、什么是智能指针

智能指针就是用一个对象维护另一个内存空间,当我们new出一块空间地址后,就不用手动的去delete它,而是交给智能指针帮我们做这件事。简单的说智能指针就是自动的帮我们释放new的内存,而不用手动释放。智能指针实现的原理就是通过调用析构函数来间接释放new的内存。

二、auto_ptr使用方法

#include <iostream>
#include <memory>  // auto_ptr 包含的头文件
using namespace std;

class MyType
{
public:
	MyType()
	{
		cout << "MyType()..." << endl;
	}
	~MyType()
	{
		cout << "~MyType()..." << endl;
	}
};

int main()
{
	MyType * pType = new MyType;
	auto_ptr<MyType> autoPtr(pType); 
	return 0;
}

运行结果:

MyType()...
~MyType()...

结果显示析构函数~MyType()被调用 说明autoPtr已经帮我们自动回收pType指向的内存空间 所以不用我们手动delete pType;

三、智能指针自我实现

在很多面试题都会叫你自己实现一个智能指针 这是面试中经常考察的点 下面我们来动手操作一下:

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

template <typename T>
class MyAutoPtr
{
private:
	T * ptr;
public:
	MyAutoPtr(T* pt)
	{
		ptr = pt;
	}
	~MyAutoPtr()
	{
		if (ptr != NULL)
		{
			delete ptr;
			ptr = NULL;
			cout << "delete ptr" << endl;
		}
	}
        // 重载 -> 运算符
	T* operator->()
	{
		return this->ptr;
	}
        // 重载 * 运算符
	T& operator*()
	{
		return *(this->ptr);
	}
};
class A
{
public:
	int a;
	A() :a(10) { cout << "A()..." << endl; }
    ~A(){ cout << "~A()..." << endl; }
	void funa()
	{
		cout << "a = " << a << endl;
	}
};
void main()
{
	A * a = new A;
	MyAutoPtr<A> autoPtr(a);
	autoPtr->funa(); 
	(*autoPtr).funa();
}

运行结果:

A()...
a = 10
a = 10
~A()...
delete ptr

测试结果可一看出我们实现的智能指针能够正确的回收内存 基本功能都已经实现啦。

四、总结

通过上面的例子我们可以知道智能指针的原理就是通过一个对象autoPtr去维护另一个new出来的内存空间,当autoPtr的生存周期到了时会销毁对象autoPtr,而在销毁一个对象的时候必然会调用该对象的析构函数,此时我们就可以再调用的析构函数里释放之前new出来的内存空间。算啊发

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值