基于C++实现一个简单的智能指针类

Dear 丶 2022-06-16 01:28 363阅读 0赞

在C、C++类的语言当中对指针的使用是十分常见和重要的,但是使用指针也很容易导致内存泄漏、不安全的情况发生,本文就针对这种情况来实现一个简单的智能指针类,通过这个类实现对指针操作的封装,降低使用指针带来的负面影响。

一、实现智能指针的两个类

1、RefBase类

这个类的具体实现如下:

  1. /* 定义一个引用计数的基类 */
  2. class RefBase{
  3. private:
  4. int cnt; // 引用计数的数值
  5. public:
  6. RefBase() : cnt(0){} // 通过构造函数将引用计数的初值设为0
  7. void incStrongCnt(void){this->cnt++;} // 引用计数加一
  8. void decStrongCnt(void){this->cnt--;} // 引用计数减一
  9. int getStrongCnt(void){return this->cnt;} // 获得引用计数
  10. };

这是一个使用智能指针的所有类都要继承的基类,通过这个类中的引用计数的相关操作来判定当前类的引用计数是否为0,以此来判断当前指针对象是否可以是否,确保内存释放的安全性。
2、SP类

这是指针指针实现的核心类,它的实现具体如下:

  1. /* 定义智能指针的模板类 */
  2. template<typename T> class SP{
  3. private:
  4. T *p;
  5. public:
  6. SP() : p(0){} // 空的构造函数
  7. SP(T *other) // 定义赋值构造函数,把对象指针作为参数赋值给智能指针对象的私有属性
  8. {
  9. this->p = other;
  10. p->incStrongCnt();
  11. }
  12. SP(const SP& other) // 定义拷贝构造函数
  13. {
  14. this->p = other.p;
  15. p->incStrongCnt();
  16. }
  17. ~SP() // 定义析构函数,当引用计数为0时,释放对象
  18. {
  19. if(p)
  20. {
  21. p->decStrongCnt();
  22. if(p->getStrongCnt() == 0) // 判断引用计数是否为0
  23. delete p;
  24. }
  25. }
  26. /* 定义指向操作的运算符重载 */
  27. T* operator->()
  28. {
  29. return this->p;
  30. }
  31. /* 定义应用操作的运算符重载 */
  32. T& operator*()
  33. {
  34. return *(this->p);
  35. }
  36. };

在这个类中实现了基本的赋值构造函数和拷贝构造函数,有因为是对指针的操作所以实现了基本的引用、指向操作符的重载。

二、测试
实现一个简单的小例子来对智能指针进行测试,为此定义了一个Demo类,这个类的具体实现如下(注意这个类的必须继承至RefBase类):

  1. /* 定义一个测试类来测试智能指针 */
  2. class Demo : public RefBase{
  3. public :
  4. /* 定义构造函数和析构函数用来进行测试 */
  5. Demo(){cout << "Demo()" << endl;}
  6. ~Demo(){cout << "~Demo()" << endl;}
  7. void printInfo(){cout << "Hello,world!" << endl;} // 定义一个测试函数
  8. };

在main函数中实现如下代码:

  1. /* 定义一个demo的智能指针对象 */
  2. SP<Demo> demo = new Demo();
  3. demo->printInfo();
  4. SP<Demo> demo2 = demo; // 将demo直接赋值给demo2,调用拷贝构造函数
  5. demo2->printInfo();

编译并运行试验结构如下:

Center

附录:本文实现的完整例程如下所示。

  1. #include <iostream>
  2. using namespace std;
  3. /* 定义一个引用计数的基类 */
  4. class RefBase{
  5. private:
  6. int cnt; // 引用计数的数值
  7. public:
  8. RefBase() : cnt(0){} // 通过构造函数将引用计数的初值设为0
  9. void incStrongCnt(void){this->cnt++;} // 引用计数加一
  10. void decStrongCnt(void){this->cnt--;} // 引用计数减一
  11. int getStrongCnt(void){return this->cnt;} // 获得引用计数
  12. };
  13. /* 定义智能指针的模板类 */
  14. template<typename T> class SP{
  15. private:
  16. T *p;
  17. public:
  18. SP() : p(0){} // 空的构造函数
  19. SP(T *other) // 定义赋值构造函数,把对象指针作为参数赋值给智能指针对象的私有属性
  20. {
  21. this->p = other;
  22. p->incStrongCnt();
  23. }
  24. SP(const SP& other) // 定义拷贝构造函数
  25. {
  26. this->p = other.p;
  27. p->incStrongCnt();
  28. }
  29. ~SP() // 定义析构函数,当引用计数为0时,释放对象
  30. {
  31. if(p)
  32. {
  33. p->decStrongCnt();
  34. if(p->getStrongCnt() == 0) // 判断引用计数是否为0
  35. delete p;
  36. }
  37. }
  38. /* 定义指向操作的运算符重载 */
  39. T* operator->()
  40. {
  41. return this->p;
  42. }
  43. /* 定义应用操作的运算符重载 */
  44. T& operator*()
  45. {
  46. return *(this->p);
  47. }
  48. };
  49. /* 定义一个测试类来测试智能指针 */
  50. class Demo : public RefBase{
  51. public :
  52. /* 定义构造函数和析构函数用来进行测试 */
  53. Demo(){cout << "Demo()" << endl;}
  54. ~Demo(){cout << "~Demo()" << endl;}
  55. void printInfo(){cout << "Hello,world!" << endl;} // 定义一个测试函数
  56. };
  57. /* 程序的入口函数 */
  58. int main(int argc, char *argv[])
  59. {
  60. /* 定义一个demo的智能指针对象 */
  61. SP<Demo> demo = new Demo();
  62. demo->printInfo();
  63. SP<Demo> demo2 = demo; // 将demo直接赋值给demo2,调用拷贝构造函数
  64. demo2->printInfo();
  65. return 0;
  66. }

发表评论

表情:
评论列表 (有 0 条评论,363人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++智能指针简单剖析

    智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放。 1. 智能指针背后的设

    相关 基于C++实现一个简单智能指针

    在C、C++类的语言当中对指针的使用是十分常见和重要的,但是使用指针也很容易导致内存泄漏、不安全的情况发生,本文就针对这种情况来实现一个简单的智能指针类,通过这个类实现对指针操

    相关 C++-智能指针——简单实现分析

    > 一:为什么要有智能指针 在我们动态开辟内存时,每次new完就一定会有配套的delete来完成释放操作。可是这时候问题就来了,有时候程序未必会执行到我们释放的那一步,