c++智能指针 示例讲解

举报
风吹稻花香 发表于 2021/06/05 00:01:42 2021/06/05
【摘要】   智能指针实际上就是通过模板技术实现的一个类 内存泄露(臭名昭著的Bug)——在软件开发和测试阶段都不容易被发现 -动态申请堆空间,用完后不归还 -C++语言中没有垃圾回收的机制 -指针无法控制所指堆空间的生命周期 当代C++软件平台中的智能指针 -指针生命周期结束时主动释放堆空间 -一片堆空间最多只能由一个指针标识 -杜绝指针运算和指针比较 智能指针的...

 

智能指针实际上就是通过模板技术实现的一个类

内存泄露(臭名昭著的Bug)——在软件开发和测试阶段都不容易被发现
-动态申请堆空间,用完后不归还
-C++语言中没有垃圾回收的机制
-指针无法控制所指堆空间的生命周期

当代C++软件平台中的智能指针
-指针生命周期结束时主动释放堆空间
-一片堆空间最多只能由一个指针标识

-杜绝指针运算和指针比较

智能指针的设计方案
-通过类模板描述指针的行为
  能够定义不同类型的指针对象
-重载指针特征操作符(->和*)
  利用对象模拟原生指针的行为

 

SmartPointer.h


  
  1. #ifndef SMARTPOINTER_H_
  2. #define SMARTPOINTER_H_
  3. namespace DTLib
  4. {
  5. template <typename T>
  6. class SmartPointer
  7. {
  8. protected:
  9. T* m_pointer;
  10. public:
  11. SmartPointer(T* p =NULL)
  12. {
  13. m_pointer = p;
  14. }
  15. T* operator ->()
  16. {
  17. return m_pointer;
  18. }
  19. T& operator *()
  20. {
  21. return *m_pointer;
  22. }
  23. SmartPointer(const SmartPointer<T>& obj)
  24. {
  25. m_pointer = obj.m_pointer;
  26. const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;
  27. }
  28. SmartPointer<T>& operator = (const SmartPointer<T>& obj)
  29. {
  30. if(this != &obj)
  31. {
  32. delete m_pointer;
  33. m_pointer = obj.m_pointer;
  34. const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;
  35. }
  36. return *this; //可以支持连续赋值
  37. }
  38. T* get()
  39. {
  40. return m_pointer;
  41. }
  42. bool isNull()
  43. {
  44. return (m_pointer == NULL);
  45. }
  46. ~SmartPointer()
  47. {
  48. delete m_pointer;
  49. }
  50. };
  51. }
  52. #endif // SMARTPOINTER_H_

 

main.cpp


  
  1. #include <iostream>
  2. #include "SmartPointer.h"
  3. using namespace std;
  4. using namespace DTLib;
  5. class Test
  6. {
  7. public:
  8. Test()
  9. {
  10. cout << "Test()" << endl;
  11. }
  12. ~Test()
  13. {
  14. cout << "~Test()" << endl;
  15. }
  16. };
  17. int main()
  18. {
  19. SmartPointer<Test> sp = new Test();
  20. SmartPointer<Test> nsp;
  21. nsp = sp;
  22. cout << sp.isNull() << endl;
  23. cout << nsp.isNull() << endl;
  24. cout << "sp = " << sp.get() << endl;
  25. cout << "nsp = " << nsp.get() << endl;
  26. return 0;
  27. }

 

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/116955666

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。