C++中智能指针

    在C、C++中,内存泄漏引起的Bug数不胜数,主要就是申请动态内存后用完不释放,而C++又不像java那样拥有内存回收机制,在C++中,指针是无法控制所指堆空间生命周期的,所以非常容易造成堆空间申请未释放,导致内存泄漏,甚至软件奔溃。

    为了解决这个问题,C++中引入了智能指针的概念
    -智能指针是一种特殊的指针
    -智能指针的生命周期结束时主动释放堆空间
    -一片堆空间最多只能由yi个指针标识,防止重复释放
    -杜绝指针运算跟比较

    C++中,我们通过类成员函数重载指针特征操作符( -> 和 *),并且不能使用参数,下边来看下代码:
 

#include <iostream>
#include <string>

using namespace std;

class Test
{
private:
    int m_value;
public:
    Test(){}
    Test(int i)
    {
    	m_value = i; 
    }

    int getValue()
    {
    	return m_value;
    }

    ~Test()
    {
    }

};

class SmartPointer
{
private:
    Test *m_pTest;	//目前创建的SmartPointer智能指针只能指向Test类对象

public:
    SmartPointer(Test *p = NULL)
    {
        cout << "SmartPointer(Test *p = NULL)" << endl;
    	m_pTest = p;
    }

    SmartPointer(const SmartPointer& obj)	//重写拷贝构造函数
    {
       cout << "SmartPointer(const SmartPointer& obj)" << endl;
       m_pTest = obj.m_pTest;
       const_cast<SmartPointer&>(obj).m_pTest = NULL;
    }

    SmartPointer& operator =(const SmartPointer& obj)	//赋值构造函数
    {
        if (this != &obj)
        {
            delete m_pTest;
            m_pTest = obj.m_pTest;
            const_cast<SmartPointer&>(obj).m_pTest = NULL;
        }
        return *this;
    }

    bool isNULL()
    {
        return (NULL == m_pTest);
    }

    Test* operator ->()	//重载指针操作符
    {
        return m_pTest;
    }

    Test& operator *()	//重载指针操作符
    { 
        return *m_pTest;
    }


    ~SmartPointer()
    {
        cout << "~SmartPointer()" << endl;
        if (!isNULL())
        {
            delete m_pTest;
        }
    }
};


int main()
{
    {
    	SmartPointer p1 = new Test(12);
    	SmartPointer p2 = p1;

    	cout << "p1.isNULL() = " << p1.isNULL() << endl;
    	cout << "p2->getValue() = " << p2->getValue() << endl;
    }

    system("pause");
}

编译运行:

从输出结果看,当智能指针的生命周期结束后,会自动调用析构函数,做对应的内存释放,这样就避免了内存泄漏。但是上边我们所写的智能指针,只能指向Test类对象,在后续的模板及泛型编程,我们会解决这个问题,使得智能指针能指向任意的变量及对象。

注意:智能指针只能指向堆空间的对象或变量!

总结:
    - 指针特征操作符( -> *)可以被重载
    - 重载指针特征符能够使用对象代替指针
    - 智能指针只能用于指向堆空间中的内存
    - 智能指针的意义在于最大程度的避免内存泄漏问题

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/81462142