一个智能指针的小程序,使用模板函数开发,附带测试程序

代码如下:

///auto ptr

template<typename T>
class AutoPtr
{
struct t_ptr
{
T* __ptr;
int __counter;
t_ptr(T*ptr)
{
__ptr = ptr;
__counter = 1;
};
t_ptr(){__ptr = NULL;__counter = 0;}
~t_ptr(){delete __ptr;}
};
private:
t_ptr* m_ptr;
public:
AutoPtr();
AutoPtr(T* ptr = NULL);
AutoPtr(const AutoPtr& rhs);
AutoPtr<T>& operator=(const AutoPtr<T>& rhs);
T& operator*();
T*operator->();
~AutoPtr();
private:
void _AddRef();
void _DeRef();
};
defination of AutoPtr
//构造函数
template<typename T>
AutoPtr<T>::AutoPtr(T* ptr)
{
m_ptr = new t_ptr(ptr);
}
//构造函数
template<typename T>
AutoPtr<T>::AutoPtr()
{
m_ptr = new t_ptr();
}
//拷贝构造函数
template<typename T>
AutoPtr<T>::AutoPtr(const AutoPtr& rhs):m_ptr(rhs.m_ptr)
{
_AddRef();
}
//赋值操作
template<typename T>
AutoPtr<T>& AutoPtr<T>::operator=(const AutoPtr<T>& rhs)
{
if(m_ptr != rhs.m_ptr)
{
if(NULL != m_ptr)//将要接受新指针,需要将原来的引用计数减掉。
--m_ptr->__counter;
m_ptr = rhs.m_ptr;
_AddRef();
}
}
//析构函数
template<typename T>
AutoPtr<T>::~AutoPtr()
{
_DeRef();
}
/
template<typename T>
T& AutoPtr<T>::operator*()
{
return *m_ptr->__ptr;
}
template<typename T>
T* AutoPtr<T>::operator->()
{
return m_ptr->__ptr;
}
/计数器增减操作//
template<typename T>
void AutoPtr<T>::_AddRef()
{
if(NULL != m_ptr)
++m_ptr->__counter;
}
template<typename T>
void AutoPtr<T>::_DeRef()
{
if(NULL == m_ptr)
return ;
--m_ptr->__counter;
if(m_ptr->__counter <= 0)
delete m_ptr;
}

//test

//testmain.cpp
#include<iostream>
#include "AutoPtr.h"
using namespace std;
class TestClass
{
int m_iCounter;
public:
int Get(){return m_iCounter;}
void Set(int iVal){m_iCounter = iVal;}
};
using namespace std;
int main()
{
AutoPtr<TestClass> ap(new TestClass);
ap->Set(200);
cout<<"ap->Get():"<<ap->Get()<<endl;
AutoPtr<TestClass>ap2 = ap;
cout<<"ap2->Get():"<<ap2->Get()<<endl;
ap2->Set(600);
cout<<"after ap->Get():"<<ap->Get()<<endl;
cout<<"after ap2->Get():"<<ap2->Get()<<endl;
return 0;
}

一个自己实现的简单的智能指针模板类相关推荐

  1. C++智能指针模板类

    对于常规类指针,可能由于忘记释放内存而导致内存泄漏,有三种智能指针可以解决这类问题. 对于常规指针,它没有析构函数,加入指针成为了对象,那么,在对象过期时就会自动调用析构函数,让析构函数释放指针指向的 ...

  2. 《C++ Primer Plus》16.2 智能指针模板类

    智能指针是行为类似于指针的类对象,单这种对象还有其他功能.本节介绍三个可帮助管理动态内存分配的智能指针类.先来看看需要哪些功能以及这些功能是如何实现的.请看下面的函数: void remodel(st ...

  3. C++智能指针管理类

    1.程序猿明白的进行内存释放 对于c++程序猿,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存.须要程序猿负责对分配的内存进行释放.但有时内存的释放看起来并不件非常轻松的事,例如以下 ...

  4. 简单剖析智能指针的思想

    谈到智能指针之前,必须要知道堆栈的相关思想,堆栈在程序开发过程中经常使用到的.比如应用程序的函数当中通过new一个对象,这个对象的实际存储地方是在堆上,而它的指针是保存在栈,在函数执行完毕之后,该对象 ...

  5. C++ 手动实现简单的智能指针类

    何为智能指针,即不需要用户再自动手动New和Delete掉,由内部类进行new和delete,这样可以防止用户忘记释放掉指针而造成的内存泄漏. 这里简单的实现unique_ptr智能指针的方式. 头文 ...

  6. VTK源码阅读--VTK里的智能指针vtkSmartPointer类

    vtkSmartPointer类 vtkSmartPointer是一个类模板,为vtkSmartPointerBase超类持有的对象提供自动强制转换. #ifndef vtkSmartPointer_ ...

  7. c++string 加引号_C++|引用计数与shared_ptr智能指针(以实现String类为例)

    C++ 中,动态内存的管理是通过一对运算符来完成的,new 用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针.delete接收一个动态对象的指针,调用对象的析构函数销毁对象,释放与之 ...

  8. 资源共享型智能指针实现方式

    [1]资源共享型智能指针实现方式简述 资源共享型的智能指针有两种实现方式:一种是侵入式:一种是非侵入式. 网上以及书籍比较常见的是非侵入式的,它的实现完全放在智能指针模板类内. 模板类有一个用于保存资 ...

  9. c++中的智能指针详解

    智能指针是行为类似于指针的类对象,但是这种对象还有其他的功能.一般用于帮助管理动态内存. 我们需要知道,我们每次在对象中new出一块内存空间都需要在对象销毁时delete掉,否则就会造成内存泄露,这些 ...

最新文章

  1. http://www.cnblogs.com/dolphin0520/p/3949310.html
  2. 100题_22 整数的二进制表示中1的个数
  3. java 单例设计模式 [
  4. LetCode-MSSQL超过5名学生的课
  5. RSA算法与DSA算法的区别
  6. vue中this.init用法_Vue中的this.$options.data()和this.$data用法说明
  7. netscreen 25配置外网到内网的Webserver实践
  8. java moneyutils_java中每月等额与先息后本计算
  9. 基类成员函数和派生类成员函数不构成重载
  10. 知云文献翻译打不开_推荐一个很好用的阅读英文文献工具(研究僧看过来啦!!!)...
  11. 5G LTE窄带物联网(NB-IoT) 10
  12. 服务器硬件工程师从入门到精通系列视频教程(1)-基础篇-赵振坤-专题视频课程...
  13. 手把手教你如何删除病毒木马(转)
  14. 《UnityAPI.Color颜色》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Color+Lerp+RGBToHSV+gamma+linear+立钻哥哥++OK++)
  15. 在页面添加天气预报显示
  16. Unity【LOD Group】- 关于性能优化中LOD的使用与总结
  17. Qt植物大战僵尸实现修改阳光和无冷却
  18. ubuntu20.04禁止自动休眠的几种方式
  19. 60天 冲刺软考高级项目管理师(第一天)
  20. 常用的Matlab的函数

热门文章

  1. 【idea基础知识】在maven项目中额外增加jar包
  2. java.util.vector中的vector的详细用法
  3. Spark机器学习库MLib分类和回归文档V1.4.1(翻译)
  4. java控制并发数量_Java并发编程中级篇(二):使用Semaphore信号量进行多个资源并发控制...
  5. maven仓库的安装与配置
  6. argo 现水下永动机器人_水下永动机器人现身
  7. shell 不等于_Shell 布尔运算符与逻辑运算符
  8. java 泛型重载_Java泛型编程与多态、重载的同与不同
  9. flutter offset_牛笔!自己用Flutter撸一个天气APP
  10. 创建此对象的程序是quation_MathType出现此对象创建于Equation中的问题怎么办