一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧)。近花了点时间认真看了智能指针,特地来写这篇文章。
  智能指针是什么
  简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况。
  普通指针存在的问题
  C语言、C++语言没有自动内存回收机制,关于内存的操作的安全性依赖于程序员的自觉。程序员每次new出来的内存块都需要自己使用delete进行释放,流程复杂可能会导致忘记释放内存而造成内存泄漏。而智能指针也致力于解决这种问题,使程序员专注于指针的使用而把内存管理交给智能指针。
  我们先来看看普通指针的悬垂指针问题。当有多个指针指向同一个基础对象时,如果某个指针delete了该基础对象,对这个指针来说它是明确了它所指的对象被释放掉了,所以它不会再对所指对象进行操作,但是对于剩下的其他指针来说呢?它们还傻傻地指向已经被删除的基础对象并随时准备对它进行操作。于是悬垂指针形成了,程序崩溃也“指日可待”。我们通过代码+图来来探求悬垂指针的解决方法。
  int * ptr1 = new int (1);
  int * ptr2 = ptr1;
  int * ptr3 = prt2;
  cout << *ptr1 << endl;
  cout << *ptr2 << endl;
  cout << *ptr3 << endl;
  delete ptr1;
  cout << *ptr2 << endl;
  代码简单不?嗦解释了。运行结果是输出ptr2时并不是期待的1,因为1已经被删除了。这个过程是这样的: