文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C++内存管理神器之模板化的智能指针

C++内存管理神器之模板化的智能指针

时间:2010-10-27  来源:LayzerAr

C++标准类库里面有实现智能指针auto_ptr,位于头文件<memory>。

 

/*
 * SmartPointer.h
 *
 *  Created on: 2010-10-27
 *      Author: LayzerAr
 */

#ifndef __SMARTPOINTER_H_INCLUDE__
#define __SMARTPOINTER_H_INCLUDE__

template<class T>
class SmartPointer {
public:
        SmartPointer(T* ptr = 0) :
                Ptr(ptr) {
        }

        SmartPointer(SmartPointer<T>& other) :
                Ptr(other.Ptr) {
                other.Ptr = 0;
        }

        virtual ~SmartPointer() {
                release();
        }

        SmartPointer<T>& operator=(SmartPointer<T>& other) {
                if (this != &other) {
                        this->Ptr = other.Ptr;
                        other.Ptr = 0;
                }
                return *this;
        }

        T& operator*() const {
                return *Ptr;
        }

        T* operator->() const {
                return Ptr;
        }

        void release() {
                if (Ptr != 0) {
                        delete Ptr;
                        Ptr = 0;
                }
        }

        void reset(T* newptr) {
                if (Ptr != newptr) {
                        release();
                        Ptr = newptr;
                }
        }

private:

        T* Ptr;
};

#endif /* __SMARTPOINTER_H_INCLUDE__ */

 

概述:

  我们经常为C++的内存管理叫苦不迭,简单的代码还好,稍微复杂一点,可能就会忘记delete掉new出来的对象,这样就造成了内存泄漏,多次delete可能会使程序崩溃。

  为什么说模板化的智能指针是C++内存管理的神器呢?

  首先,我们必须改变代码风格:不再返回指针Object*,取而代之用SmartPointer<Object>(非指针、非引用),并且在该模板类的实例里面保存有我们需要的指针Object*。

  那么我们来看一下:

  SmartPointer类里面重载了解引用操作符,这意味着,我们可以直接用SmartPointer<Object>类的实例(obj->func(),*(obj).func())来访问Object的公有成员;

  由于我们返回的SmartPointer<Object>并非是new出来的对象,所以当该变量超出了作业范围时,会根据析构函数(在析构函数中调用release()方法,这里我们定义了SmartPointer指向的Object*的析构规则)来析构本对象和期指向的对象,这意味着,我们即使忘了了调用delete也没关系,因为他会Object*指向的实例会跟随这SmartPointer变量一起被析构,多美妙啊;

  在性能需求下,我们还可以调用release()方法主动析构掉Object*;

  另外,由于这个SmartPointer经过了模板化,所以几乎可以适用与任何类的指针,只增加少量的代码,就轻松方便的实现了C++内存管理。

相关阅读 更多 +
排行榜 更多 +
我狙击打的贼准

我狙击打的贼准

飞行射击 下载
暗夜编年史

暗夜编年史

飞行射击 下载
狙击先生子弹行动

狙击先生子弹行动

飞行射击 下载