• 智能指针模板


     STL库的智能指针:auto_ptr

      1. auto_ptr声明周期结束时,自动销毁指向的内存空间。(内存泄漏)

      2. 不能指向堆数组,只能指向堆空间单个对象或变量。

      3. 不能进行指针运算和指针比较。

      4. 多个auto_ptr不能指向同一个堆空间。

    #include <iostream>
    #include <string>
    #include <memory>  // 智能指针类模板库
    
    using namespace std;
    
    class Test
    {
        string m_name;
    public:
        Test()
        {
            cout << "Test constructor" << endl;
        }
        ~Test()
        {
            cout << "Test destructor "<< endl;
        }
    };
    
    int main()
    {
        auto_ptr<Test> pt(new Test());    
        cout << "pt = " << pt << endl;   //  0x7fffc05cee7    
        auto_ptr<Test> pt1(pt);  // pt将不再指向的堆空间,由pt1来指向堆空间。此时pt为空  
        cout << "pt = " << pt << endl;  // 0
        cout << "pt1 = " << pt1 << endl;  // 0x7fffc05cee70  pt1指向和原来pt指向相同的堆空间    
        return 0;
    }

      STL库的智能指针:shared_ptr,weak_ptr,unique_ptr

      1. 带有引用计数,支持多个指针指向同一片内存。

      2. 配合shared_ptr使用。  

      3.  只能由一个指针指向一个内存空间,不能拷贝和构造。

     QT(跨操作系统应用平台开发库)中的智能指针:Qpointe,QSharedPointer

    Qpointer:

      当其指向的对象空间被销毁时,指针自动置为空。(防止野指针,多次释放同一内存)

      析构时不会自动销毁所指对象。(delect不会自动删除对应空间内存)

    QSharedPointer: 

      引用计数型指针(创建时计数加一,销毁时减一),引用计数为0才删除指针对象。

      有拷贝构造函数和赋值重载函数。

    例:创建智能指针模板。

     构造函数(初始化指针)。析构函数(删除指针指向的空间)。拷贝构造函数,赋值重载函数(一个空间只被一个指针指向)。

     重载解指针,成员访问符(*,->)。不重载指针运算操作符(+,-)。

    #ifndef _SMARTPOINTER_H_
    #define _SMARTPOINTER_H_
    
    template
    < typename T >
    class SmartPointer
    {
        T* mp;
    public:
        SmartPointer(T* p = NULL)
        {
            mp = p;
        }
        
        SmartPointer(const SmartPointer<T>& obj) // 拷贝构造时保证所有权的转移
        {
            mp = obj.mp; // 转移所有权
            const_cast<SmartPointer<T>&>(obj).mp = NULL;// 对应智能指针赋值为空
        }
        
        SmartPointer<T>& operator = (const SmartPointer<T>& obj)  // 赋值时保证所有权的转移
        {
            if( this != &obj )
            {
                delete mp;
                mp = obj.mp;  // 转移所有权
                const_cast<SmartPointer<T>&>(obj).mp = NULL; // 对应智能指针赋值为空
            }
            
            return *this;
        }
        
        T* operator -> ()
        {
            return mp;
        }
        
        T& operator * ()
        {
            return *mp;
        }
        
        bool isNull()
        {
            return (mp == NULL);
        }
        
        T* get()
        {
            return mp;
        }
        
        ~SmartPointer()
        {
            delete mp;
        }
    };
    
    #endif
    View Code
    #include <iostream>
    #include <string>
    #include "SmartPointer.h"  // 自己创建的智能指针模板
    
    using namespace std;
    
    class Test
    {
        string m_name;
    public:
        Test()
        {
            cout << "Test contructor" << endl;
        }
        
        ~Test()
        {
            cout << "Test destructor" << endl;
        }
    };
    
    int main()
    {
        SmartPointer<Test> pt(new Test());  
        cout << "pt = " << pt.get() << endl;
        
        SmartPointer<Test> pt1(pt);   
        cout << "pt = " << pt.get() << endl;
        cout << "pt1 = " << pt1.get() << endl;
      
        return 0;
    }
    View Code
  • 相关阅读:
    【Android】开发优化之——调优工具:TrackView,Method Profiling
    MapReduce:具体解释Shuffle过程
    Kafka编程实例
    常用的语句
    CDN
    iOS中的固定 高度
    iPhone手机屏幕的尺寸180330更新
    UITextField
    iOS基本网络请求
    Xcode界面简介
  • 原文地址:https://www.cnblogs.com/zsy12138/p/10862531.html
Copyright © 2020-2023  润新知