当前位置:编程学习 > C/C++ >>

用c++简单实现智能指针

用c++简单实现智能指针

      什么是智能指针?答案相当简单;智能指针是聪明的普通指针。这是什么意思?实际上,智能指针是一些对象,表现出普通指针的功能但是比普通指针多做了一些事情。这些对象像普通指针一样灵活,并且管理对象有自己的优点(比如构造器和自动析构)。智能指针解决了普通指针的一些问题。

      普通指针的问题。

      我们使用C++语言中的指针,最常见的问题是什么?内存管理吧,请看下面的代码:

[cpp]
char* pName  = new char[1024]; 
… 
SetName(pName); 
… 
… 
if(null != pName) 

       delete[] pName;  

char* pName  = new char[1024];

SetName(pName);


if(null != pName)
{
       delete[] pName;
}


      好多次我们都会忘记释放pNme,并且管理释放这些不会再用到的指针将会是很大的工程。可不可以指针自身进行管理?当然,智能指针就可以做到。我们实现一个智能指针,看看智能指针如何处理的更好。
      下面写一个实际例子,先写一个叫做Person的类。
     
[cpp]
class Person 

    int age; 
    char* pName; 
 
    public: 
        Person(): pName(0),age(0) 
        { 
        } 
        Person(char* pName, int age): pName(pName), age(age) 
        { 
        } 
        ~Person() 
        { 
        } 
 
        void Display() 
        { 
            printf("Name = %s Age = %d \n", pName, age); 
        } 
        void Shout() 
        { 
            printf("Ooooooooooooooooo"); 
        }  
}; 

class Person
{
    int age;
    char* pName;

    public:
        Person(): pName(0),age(0)
        {
        }
        Person(char* pName, int age): pName(pName), age(age)
        {
        }
        ~Person()
        {
        }

        void Display()
        {
            printf("Name = %s Age = %d \n", pName, age);
        }
        void Shout()
        {
            printf("Ooooooooooooooooo");
        }
};
下面是客户端代码使用Person类。

[cpp]
void main() 

    Person* pPerson  = new Person("Scott", 25); 
    pPerson->Display(); 
    delete pPerson; 

void main()
{
    Person* pPerson  = new Person("Scott", 25);
    pPerson->Display();
    delete pPerson;
}


现在我们来看这段代码,每当我创建一个指针,都要管理释放它。我要自动的释放它,智能指针可以。因此我们创建一个SP类来管理Person的对象,客户端的代码可以这样写:

[cpp]
void main() 

    SP p(new Person("Scott", 25)); 
    p->Display(); 
    // Dont need to delete Person pointer..  

void main()
{
    SP p(new Person("Scott", 25));
    p->Display();
    // Dont need to delete Person pointer..
}
[cpp]
void main() 

    SP p(new Person("Scott", 25)); 
    p->Display(); 
    // Dont need to delete Person pointer..  

void main()
{
    SP p(new Person("Scott", 25));
    p->Display();
    // Dont need to delete Person pointer..
}
注意:
     1,我们创建了一个SP对象来管理Person的指针,当SP对象的作用域结束,会自动析构,它将释放Person的指针。
     2,我们可以使用SP的对象p调用Display()函数,就像Person类的对象指针调用Display()函数,它的行为表现的像Person类的对象指针。
智能指针接口
   智能指针表现出指针的行为,所以应该支持如下运算符:
 
Dereferencing (operator *)
Indirection (operator ->)
下面实现智能指针SP:
[cpp]
class SP 

private: 
    Person*    pData; // pointer to person class  
public: 
    SP(Person* pValue) : pData(pValue) 
    { 
    } 
    ~SP() 
    { 
        // pointer no longer requried  
        delete pData; 
    } 
 
    Person& operator* () 
    { 
        return *pData; 
    } 
 
    Person* operator-> () 
    {     
        return pData; 
    } 
}; 

class SP
{
private:
    Person*    pData; // pointer to person class
public:
    SP(Person* pValue) : pData(pValue)
    {
    }
    ~SP()
    {
        // pointer no longer requried
        delete pData;
    }

    Person& operator* ()
    {
        return *pData;
    }

    Person* operator-> ()
    {   
        return pData;
    }
};
这就

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,