C++11智能指针的前因后果
0 前言 据说用过java的人都说java好,很大一部分是java里没有指针的概念,并提供自动垃圾机制,而C/C++语言经常会被内存的释放问题搞得头疼。 全局对象在程序启动时分配,在程序结束时销毁。对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部stratic对象在第一次使用前分配,在程序结束时销毁。 对于自动和static对象外,C++还支持动态分配对象。动态分配的对象的生存期与它们在哪儿创建是无关的,只有当显示地被释放时,这些对象才会销毁。 动态对象的正确分配/释放被证明是编程中极其容易出现错误的地方,从语言层次上归纳为以下问题: (1)野指针(空悬指针) :一些内存单元已经被释放,之前指向它的指针却还在被使用。这些内存有可能被运行的系统重新分配给程序使用,从而导致了无法预测的错误。 解决措施:delete后,将nullptr赋予指针,表明指针不指向任何对象。但可能有多个指针指向相同的内存,在delete内存后重置指针只对这个指针有效,对其他任何仍指向(已释放的)的内存的指针式没有作用。 int *p(new int(42) // p指向动态内存 auto q = p; // p和q指向相同的内存 delete p; // p和q均变为无效 p = nullptr; // 指出p不再绑定任何对象 (2)重复释放 :程序试图去释放已经释放过的内存单元