c/c++ 标准库 智能指针( smart pointer ) 是啥玩意儿

标准库 智能指针( smart pointer ) 是啥玩意儿

一,为什么有智能指针???

c++程序员需要自己善后自己动态开辟的内存,一旦忘了释放,内存就泄露。

智能指针可以帮助程序员"自动释放"自己开辟的内存。

二,从哪里看出来智能了???

int *p = new int(11);
auto_ptr<int> pa(p);//auto_ptr已经不推荐使用
//delete p;

上面的代码把p交给智能指针auto_ptr管理后,就不需要自己去delete p。auto_ptr会去释放p,所以体现出了"智能"

三,哪里看起来像指针了???

int *p = new int(11);
my_auto_ptr<int> pa(p);                                                                
*pa = 111;
cout << *pa << endl;
cout << *p << endl;

上面的代码对智能指针pa使用了,*运算符,并且通过pa改变了p的值,所以看起来像指针哦。

class Test{
public:
  void fun(){
    cout << "func()" << endl;
  }
};

Test* pt = new Test;
auto_ptr<Test> pa1(pt);
pa1->fun();

上面的代码对智能指针pa1使用了,->运算符,并且通过pa1调用了对象pt的fun()成员方法,所以看起来像指针哦。

四,智能指针到底是个啥玩意儿???

是个模板类。

五,智能指针的是怎么实现智能指针的?

  • 在智能指针的模板类里重写**operator* **运算符
  • 在智能指针的模板类里重写operator->运算符
  • 在智能指针的模板类的析构函数里,释放它指向的内存空间
  • 管理指针的所有权和转移(下面的例子没有实现)
#include <iostream>
#include <memory>

using namespace std;

template<typename T>
class my_auto_ptr{
public:
  my_auto_ptr(T* p = nullptr):own(p!=nullptr),ptr(p){}
  ~my_auto_ptr(){
    if(own){
      delete ptr;
    }
  }
  T& operator*()const{
    return *ptr;
  }
  T* operator->()const{
    return ptr;
  }
private:
  bool own;
  T* ptr;
};
class Test{
public:
  void fun(){
    cout << "func()" << endl;
  }
};
int main(){
  //test1 老版本的auto_ptr的使用,现在不推荐使用                                
  /*                                                                            
  int *p = new int(10);                                                         
  auto_ptr<int> pa(p);                                                          
  cout << *pa << endl;                                                          
                                                                                
  string* ps = new string("aaa");                                               
  auto_ptr<string> pas(ps);                                                     
  cout << pas->size() << endl;                                                  
  */

  //test2 自己实现auto_ptr                                                      
  int *p = new int(11);
  my_auto_ptr<int> pa(p);
  //delete p;                                                                   
  *pa = 111;
  cout << *pa << endl;
  cout << *p << endl;

  Test* pt = new Test;
  my_auto_ptr<Test> pa1(pt);
  pa1->fun();

  return 0;
}

github完整代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

posted @ 2018-09-26 08:59  小石王  阅读(1223)  评论(1编辑  收藏  举报