欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-02 15:01:31
标准库 智能指针( smart pointer ) 是啥玩意儿 一,为什么有智能指针??? c++程序员需要自己善后自己动态开辟的内存,一旦忘了释放,内存就泄露。 智能指针可以帮助程序员 "自动释放" 自己开辟的内存。 二,从哪里看出来智能了??? 上面的代码把p交给智能指针auto_ptr管理后, ......

标准库 智能指针( 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;
}

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

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

本人微信:xiaoshitou5854