C++中智能指针的模板类

在C++中,智能指针是一个非常重要的概念。因为C++的类动态分配的对象不能自动释放掉,需手动调用new运算符。当程序员大意时,或程序发生异常时,或许就会发生没有手动释放内存而造成内存泄露。

智能指针的定义:就是在一个类中,存在一个指向另一个类对象的指针,并通过对指针运算符(比如:->,*)的重载,就可以实现利用当前类的对象通过指针运算符来操纵另一个类的成员(就像另一个类的指针操作一样),并且,在析构函数中定义了delete操作,借助于变量的作用域,能够实现类对象空间的自动释放。

在C++ 11中,有智能指针的类:shared_ptr<T>.头文件是#include<memory>,可以看做是一个指针,可以用一个已有的智能指针初始化一个新的智能指针,这个时候,指针的use_count()函数的结果是2,类似与文件描述符的复制,没有复制对象,只是将对象的引用计数加1。

下面的代码是一个通用的智能指针类,可以帮助了解智能指针的原理。

#ifndef SMARTPTR_HPP
#define SMARTPTR_HPP
#include <stddef.h>

template <typename T>
class SmartPtr{
    public:
        SmartPtr(T *type = NULL);
        void resetPtr(T *type);
        const T *getPtr()const;
        operator bool() const{
            return ptr_ == NULL;
        }
        ~SmartPtr();

        T &operator*();
        const T &operator*()const;
        T *operator->();
        const T *operator->()const;

    private:
        SmartPtr(const SmartPtr &);
        void operator=(const SmartPtr &);
        T *ptr_;
};

template <typename T>
inline SmartPtr<T>::SmartPtr(T *type)
    :ptr_(type)
{}

template <typename T>
inline void SmartPtr<T>::resetPtr(T *type)
{
    if(ptr_ != type){
        if(ptr_ != NULL){
            delete ptr_;
        }
        ptr_ = type;
    }
}

template <typename T>
inline const T *SmartPtr<T>::getPtr() const
{
    return ptr_;
}

template <typename T>
inline SmartPtr<T>::~SmartPtr()
{
    if(ptr_ != NULL){
        delete ptr_;
    }
}

template <typename T>
inline T &SmartPtr<T>::operator*()
{
    return *ptr_;
}

template <typename T>
inline const T &SmartPtr<T>::operator*() const
{
    return *ptr_;
}

template <typename T>
inline T *SmartPtr<T>::operator->()
{
    return ptr_;
}

template <typename T>
inline const T *SmartPtr<T>::operator->() const
{
    return ptr_;
}
#endif  /*SMARTPTR_H*/
时间: 2024-10-10 10:31:24

C++中智能指针的模板类的相关文章

C++中智能指针的设计和使用

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235      智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是 使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为

C++中智能指针的实现

C++中的智能指针是用一个类对另一个对象的指针或者引用进行管理,具体对该类的管理可以用包含对象指针以及引用计数的类来记录: 一般有两种方式实现: 1. 在对象内部记录引用的个数,这需要对象预留引用计数相关的接口 2. 用一个单独的资源管理类进行管理,则不需要修改对象 下面主要是第二种方法:(参考)http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每

Effective c++--智能指针 &amp; 函数模板

Shared_ptr允许当智能指针被建立起来是指定一个资源释放函数绑定于智能指针身上,也就是说在shared_ptr被初始化的同时也可以指定其管理的资源的释放函数.Shared_ptr提供的某个构造函数接受两个实参:一个是被管理的指针,另一个是引用次数变为0时将被调用的"删除器".Shared_ptr构造函数坚持其第一个参数必须是个指针.它支持定制型删除器. 缺省情况下C++以by value方式传递对象至函数,这种情况下函数参数都是以实际参数的副本为初值,而调用端获得的也是函数返回值

C++11中智能指针的原理、使用、实现

目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存.使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存. 理解智能指针需要从下面三个层次: 从较浅的层面看,智能指针是利用了一种叫做RAII(资

智能指针与句柄类(一)

句柄类/智能指针(smart point)是存储指向动态分配(堆)对象指针的类.除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针.句柄类实际上是通过复制指向引用计数器类型的指针,来代替复制实际对象:从而使得复制对象变成复制指针,实现虚拟复制(即是用复制对象的地址代替复制对象本身),以提高内存效率和访问速度. 引用计数是复制控制成员中使用的技术,跟踪该类有多少个对象共享一个指针.引用计数与共享对象一起存储,需要创建一个单独类指向共享对象并管理引用计数.由构造函数而不是赋

智能指针与句柄类(二)

之前文章提到写时复制(copy-on-write)技术,要实现这种功能,针对上文中Handle代码,需要将size_t * use这个抽象出来,封装成一个引用计数类,提供写时复制功能.CUseCount类实现如下: 1 class CUseCount 2 { 3 public: 4 CUseCount(); 5 CUseCount(const CUseCount&); 6 ~CUseCount(); 7 8 bool only()const; //判断引用计数是否为0, 句柄类无法访问priva

C/C++——跟我重写智能指针auto_ptr模版类

第一次使用auto_ptr的时候感觉很好用,但是对内部原理根本不懂,心里不知道这东西到底是个什么东东,总是感觉这东东比较陌生.今天有时间来简单实现一下该类模版auto_ptr,实现了该模版类的主要功能,可以让大家了解一下这个东东内部到底是个什么情况. 栈对象和堆对象的区别: 首先,看一下两种类对象的区别,一个是在栈上分配空间,另一个是在堆上分配空间. 如果看到这里,你不清楚堆和栈的区别.那我也不解释了,自行Google..(如果你想baidu也不拦你) 1.先测试栈上分配的对象 #include

智能指针与句柄类(四)

当我们希望使用容器来保存继承体系中的对象时,容器用于继承体系中的类型会有影响:派生类对象复制到基类对象时,派生类对象将被切掉.那么解决这一问题的方法通常是使用容器保存基类对象的指针,这些指针实际指向的是程序运行时动态分配的派生类对象,用户必须保证在容器析构前调用delete来释放动态分配的对象,如下例: 1 class Base 2 { 3 public: 4 virtual void action() = 0; 5 }; 6 class Derived1 : public Base 7 {..

【实战Java高并发程序设计 1】Java中的指针:Unsafe类

是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我们更进一步看一下它把! public final boolean compareAndSet(int expect, int update){ returnunsafe.compareAndSwapInt(this, valueOffset, expect, update); } 在这里,我们看到一个特殊的变