智能指针(pointer like classes)

为什么要有智能指针

C++的内存分为两种,栈和堆。栈中的内存使用之后不需要程序员去释放,会被自动释放。而在堆中分配的内存,是不能自动回收,需要程序员通过书写代码去回收。(malloc在堆中分配的内存由free来回收,New在堆中分配的内存由delete来回收。)

如何智能回收内存

借助RAII机制,RAII(Resource Acquisition Is Initialization),是C++采用的一种管理资源的方式。RAII是采用栈和依构造、析构函数的特性来管理资源。文字描述不够清晰,我们用代码来演示:

void test()
{
	ClassA *pClassA = new ClassA();
	....
	delete pClassA;
}

上诉代码表面看上去并没有问题,但在实际使用时,会经常有问题。比如在delete之前,函数退出了,那么这里就会发生内存泄漏。

前面说了,智能指针是依托栈和构造、析构的机制。如果我们把指针封装成一个类,类的构造函数分配内存,析构函数中释放内存。
在函数的最初,使用这个类构造对象,构造完,这个指针对象就指向了一块堆内存,可以使用这块内存。但是,这个指针对象在函数中是局部变量,是存储在函数栈中的。当函数结束时,该函数栈中所有的局部变量都会被释放,所以刚才构造的指针对象就会被销毁。而销毁一个对象,就会自动调用它的析构函数,从而释放刚才分配的堆内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值