服务端视角的C++从入门到精通(三)

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

3 智能指针的使用方法

智能指针是C++11标准中新引入的一个特性,它的主要作用是帮助C++开发者更好地管理内存,因为C++其中一个最为开发者痛恨和诟病的地方就是内存管理。这里的内存管理意思其实主要是指内存的所有权以及生命周期的维护。本来C/C++中是将内存管理全权交给开发者来做的,这样的好处很显然,就是C/C++可以在语言这个层级上完全抛弃掉GC(Garbage Collection),可以获得极致的性能体验。但是坏处显而易见,对于初级开发者而言,悬挂指针、空指针、野指针等形形色色的与“指针”这个名词相关的称呼就像达摩克利斯之剑一样悬在他们头顶,不知何时就会让程序在某一天莫名其妙地崩溃。

智能指针其实就是将原来的裸指针,用C++中的“类”这一概念给包裹起来,让裸指针的生命周期和类的生命周期完全绑定在一起,类出现,裸指针就被初始化并指向新的内存地址空间、传入这个类的构造函数中、被这个类所持有;类消失,裸指针指向的内存地址空间就会自动被类的析构函数所释放。

智能指针包括unique_ptrshared_ptrweak_ptr。其中unique_ptr是用来替代原来C98中auto_ptr这一类型的,它确保了指针的所有权是独占的,也就是不可能有两个指针同时指向同一块内存地址空间。这个好处是显而易见的,举个如下的例子加以说明:

int* a = (int*)malloc(sizeof(int));
int* b = a;
free(a);
free(b);

这时候,显而易见,调用free(b)时,会报错,原因也很简单,因为在调用free(a)这条语句时,a管理的占1个int(一般情况下占4个字节,与编译器有关,以后的文章中也会讲到这块内容)已经被释放、还给OS了,占用的标记其实已经重置,此时这空间已经不属于当前进程了,想释放不属于自己的东西当然会报错。