智能指针(pointer like classes)

岁酱吖の 提交于 2020-02-14 08:39:46

为什么要有智能指针

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

如何智能回收内存

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

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!