智能指针模板

 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
原文地址:https://www.cnblogs.com/zsy12138/p/10862531.html