zoukankan      html  css  js  c++  java
  • 第9课 智能指针示例

    1. 内存泄漏(臭名昭著的Bug

    (1)动态申请堆空间,用完后不归还

    (2)C++语言中没有垃圾回收的机制

    (3)指针无法控制所指堆空间的生命周期

    2. 当代C++软件平台中的智能指针

    (1)指针生命周期结束时主动释放堆空间

    (2)一片堆空间最多只能由一个指针标识

    (3)杜绝指针运算和指针比较

    3. 智能指针的设计的方案

    (1)通过类模板描述指针的行为:能够定义不同类型的指针对象。

    (2)重载指针特征操作符(->和*):利用对象模拟原生指针的行为。

    (3)智能指针的使用军规:只能用来指向堆空间中的单个对象(即不能指定一个数组对象的空间)或者变量

    【编程实验】智能指针

    //SmartPointer.h

    #ifndef _SMARTPOINTER_H_
    #define _SMARTPOINTER_H_
    
    namespace DTLib{
    
    //智能指针
    template<typename T>
    class SmartPointer
    {
        T* m_pointer;
    public:
        SmartPointer(T* p = NULL)
        {
            m_pointer = p;
        }
    
        SmartPointer(const SmartPointer<T>& obj)
        {
            m_pointer = obj.m_pointer;
            //所有权转移,使得同一时刻只能由一个指针指向堆空间
            const_cast<SmartPointer<T>&>(obj).m_pointer= NULL;
        }
    
        //重载赋值操作符
        SmartPointer<T>& operator=(const SmartPointer<T>& obj)
        {
            if(this != &obj){
                delete m_pointer;
                m_pointer = obj.m_pointer;
                //所有权转移,使得同一时刻只能由一个指针指向堆空间
                const_cast<SmartPointer<T>&>(obj).m_pointer= NULL;
            }
            return *this;
        }
    
        //重载->操作符
        T* operator->()
        {
            return m_pointer;
        }
    
        T& operator* ()
        {
            return *m_pointer;
        }
    
        bool isNull()
        {
            return (m_pointer == NULL);
        }
    
        T* get()
        {
            return m_pointer;
        }
    
        ~SmartPointer()
        {
            delete m_pointer;
        }
    };
    
    
    }
    
    #endif // _SMARTPOINTER_H_

    //main.cpp

    #include <iostream>
    #include "SmartPointer.h"
    
    using namespace std;
    using namespace DTLib;
    
    class Test
    {
    public:
        Test()
        {
            cout <<"Test()" << endl;
        }
    
        ~Test()
        {
            cout <<"~Test()" << endl;
        }
    };
    
    int main()
    {
        SmartPointer<Test> sp = new Test();
        SmartPointer<Test> nsp;
    
        nsp = sp;
    
        cout << sp.isNull() << endl;
        cout << nsp.isNull() << endl;
    
        return 0;
    }
    /*输出结果
    Test()
    1
    0
    ~Test()
    */

    4. 小结

    (1)指针特征操作符(->和*)可以被重载

    (2)重载指针特征符能够使用对象代替指针

    (3)智能指针只能用于指向堆空间中的内存

    (4)智能指针的意义在于最大程序的避免内存问题

  • 相关阅读:
    MySQL聚集索引和非聚集索引
    如何避免表单重复提交
    i++为什么是线程不安全的
    TIME_WAIT和CLOSE_WAIT
    TCP三次握手四次挥手
    get和post区别
    Session存储
    Session和Cookie的区别和联系
    Servlet与线程安全
    AQS
  • 原文地址:https://www.cnblogs.com/5iedu/p/6645701.html
Copyright © 2011-2022 走看看