STL库的智能指针:auto_ptr

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  2. 不能指向堆数组,只能指向堆对象。

  3. 一个堆空间只能属于一个auto_ptr对象。

  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.get() << endl;   //  0x7fffc05cee7    
    auto_ptr<Test> pt1(pt);  // pt将不再指向的堆空间,由pt1来指向堆空间。此时pt为空  
    cout << "pt = " << pt.get() << endl;  // 0
    cout << "pt1 = " << pt1.get() << 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才删除指针对象。

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

 

例:创建智能指针模板。

 

智能指针模板 随笔 第1张
#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 智能指针模板 随笔 第3张
#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

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄