• 智能指针


    一、实验目的

    ●熟悉智能指针

    ●对智能指针进行设计和实现

    二、实验实验环境: 在windows系统下用c++编写

    三、实验内容

    1. 对智能指针进行设计

    2. 对智能指针进行实现

    四、实验前的分析

    由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。所有智能指针都重载了“operator->”操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用“.”操作符。 访问智能指针包含的裸指针则可以用 get() 函数。由于智能指针是一个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指针是否为空,需要这样判断:if (my_smart_object.get())。智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。 智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。

    五、实验步骤

     

    1.建立一个名为smartpoint.cpp文件

    2.定义仅由smartcount类使用的smartpoint类,用于封装使用计数和相关指针

     

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
     
    1. class smartpoint  
    2. {  
    3.     int *ip;  
    4.     int P_use;  
    5.     smartpoint(int *p) : ip(p) , P_use(1)//初始化指针并将引用计数置为1  
    6.     {  
    7.        cout << "smartpoint constructor spoke !" << endl;  
    8.     }  
    9.     ~smartpoint()//定义析构函数  
    10.     {  
    11.        delete ip;  
    12.        cout << "smartpoint distructor spoke !" << endl;  
    13.     }  
    14.     friend class smartcount;// 将smartcount类设置为友元,使其成员可以访问smartpoint的成员  
    15. };  

     

    定义smartcount类用于访问smartpoint类

     

    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
     
    1. class smartcount  
    2. {  
    3. public:  
    4.    smartcount(int *p, int i) :st_conut (new smartpoint(p)) , val(i)// 构造函数:p是指向已经动态创建的int对象指针  
    5.     {  
    6.         cout << "smartcount constructor spoke ! " << "p_use = " <<st_conut->P_use << endl;  
    7.     }  
    8.   
    9.     smartcount(const smartcount& orig) : st_conut(orig.st_conut) , val(orig.val)// 复制构造函数:复制成员并将使用计数加1  
    10.     {  
    11.        ++st_conut->P_use;  
    12.        cout << "smartcount copy constructor spoke ! " << "P_use = " << st_conut->P_use << endl;  
    13.     }  
    14.   
    15.     smartcount& operator=(const smartcount&);// 赋值操作符  
    16.     ~smartcount()// 析构函数:如果计数为0,则删除smartpoint对象  
    17.     {  
    18.       cout << "smartcount distructor spoke ! " << "p_use = " << st_conut->P_use << endl;  
    19.         if (--st_conut->P_use == 0)  
    20.           delete st_conut;  
    21.     }  
    22.   
    23.       
    24. private:  
    25.     smartpoint *st_conut;   //指向使用计数类smartpoint  
    26.     int val;  
    27. };  

    注:代码有参考网络资源

    保存进行运行

     

    六、实验小结及问题分析

        (1)不管指针成员。复制时只复制指针,不复制指针指向的对象。当其中一个指针把其指向的对象的空间释放后,其它指针都成了悬浮指针。这是一种极端

        (2)当复制的时候,即复制指针,也复制指针指向的对象。这样可能造成空间的浪费。因为指针指向的对象的复制不一定是必要的。

       (3) 第三种就是一种折中的方式。利用一个辅助类来管理指针的复制。原来的类中有一个指针指向辅助类,辅助类的数据成员是一个计数器和一个指针(指向原来的)(此为本次智能指针实现方式)。

        总之智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。


  • 相关阅读:
    又回来咯
    4 20210412-1 原型设计作业
    3 20210405-1 案例分析作业
    202103226-1 编程作业
    阅读任务
    准备工作
    原型设计作业
    案例分析
    编程作业
    构建之法读后感
  • 原文地址:https://www.cnblogs.com/riasky/p/3476607.html
Copyright © 2020-2023  润新知