• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

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

自己开辟的内存。

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

int *p = new int(11);
auto_ptr<int> pa(p);//auto_ptr已经不推荐使用
//delete 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完整代码

本人微信:xiaoshitou5854


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#扩展枚举的别名发布时间:2022-07-13
下一篇:
C语言·Huffuman树发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap