目前测试功能正常。若有不完善的地方在改进吧。时候不早了睡觉去,哎,翘课会被抓,不冒险了。晚安全世界O(∩_∩)O

 /*************************************************************************
*my shared_ptr: share_ptr
*author:ERIC
*blog:http://www.ilovecpp.com
*time:2015-5-28 01:36:43
*************************************************************************/ template <typename T> class share_ptr {
private:
T* __ptr;
int* __pcounts;
public:
share_ptr(T* p= NULL);
share_ptr(const share_ptr<T>& src);
share_ptr& operator=(share_ptr<T>& src);
~share_ptr();
operator bool() const;//支持if(p)形式
T* operator-> () const;
T& operator*() const;
T* get() const;
int use_counts() const;//返回引用计数
bool unique() const;//当前智能指针是否唯一
void swap(share_ptr& rhs);//交换,成员函数
template <typename Type>//友元函数,交换两个智能指针
friend void swap(share_ptr<Type>& lhs,share_ptr<Type>& rhs);
}; template<typename T>
share_ptr<T>::share_ptr(T* p)
:__ptr(p),__pcounts(new int())
{
if(__ptr)
*__pcounts = ;
} template<typename T>
share_ptr<T>::~share_ptr()
{
--*__pcounts;
if(*__pcounts == )
{//空智能指针这里delete __ptr也安全,delete NULL;
delete __pcounts;
delete __ptr;
}
} /*__ptr(new T(src)) 很重要 ,如果直接__ptr(new T)
*会由于T类没有默认构造函数而出错
*测试的时候才发现这个问题的
*/
template<typename T>
share_ptr<T>::share_ptr (const share_ptr<T>& src)
:__pcounts(new int),__ptr(new T(src))
{
++*src.__pcounts;
__ptr = src.__ptr;
__pcounts = src.__pcounts;
} template <typename T>
share_ptr<T>& share_ptr<T>::operator= (share_ptr<T>& src)
{
--*__pcounts;
//如果是空智能指针的话 __pcounts == -1,那块内存也得释放
if(*__pcounts == || *__pcounts == -)
delete __pcounts;
++*src.__pcounts;
__ptr = src.__ptr;
__pcounts = src.__pcounts;
return *this;
} //支持if(p)这样的操作
template<typename T>
share_ptr<T>::operator bool() const
{
return __ptr;
} template<typename T>
T* share_ptr<T>::operator->() const
{
return __ptr;
} template<typename T>
T& share_ptr<T>::operator*() const
{
return *__ptr;
} template<typename T>
T* share_ptr<T>::get() const
{
return __ptr;
} template<typename T>
int share_ptr<T>::use_counts() const
{
return *__pcounts;
} template<typename T>
bool share_ptr<T>::unique() const
{
if(*__pcounts == )
return true;
else
return false;
} template<typename T>
void share_ptr<T>::swap(share_ptr<T>& rhs)
{
T* tmpPtr = rhs.__ptr;
rhs.__ptr = __ptr;
__ptr = tmpPtr;
int* tmpPcounts = rhs.__pcounts;
rhs.__pcounts = __pcounts;
__pcounts = tmpPcounts;
} template<typename T>
void swap(share_ptr<T>& lhs,share_ptr<T>& rhs)
{
T* tmpPtr = rhs.__ptr;
rhs.__ptr = lhs.__ptr;
lhs.__ptr = tmpPtr;
int* tmpPcounts = rhs.__pcounts;
rhs.__pcounts = lhs.__pcounts;
lhs.__pcounts = tmpPcounts;
} //c++11 make_shared<T>(args)
template<typename T>
share_ptr<T> make_share(T args)
{
return new T(args);
}

标准库shared_ptr智能指针的实现的更多相关文章

  1. C++11 shared_ptr智能指针(超级详细)

    在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃.程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的.比如: 有些内存资源已经被释放,但指向它的指针并没 ...

  2. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  3. auto_ptr,shared_ptr 智能指针的使用

    Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...

  4. shared_ptr智能指针源码剖析

    (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档 (http://www.boost.org/doc/ ...

  5. boost库:智能指针

    1. C98里的智能指针 std::auto_ptr ,本质上是一个普通的指针,通过地址来访问你一个动态分配的对象,初始化时需要传递一个由new操作符返回的对象地址. std::auto_ptr的析构 ...

  6. shared_ptr智能指针

    来自博客:https://www.cnblogs.com/lzpong/p/6188034.html 多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_p ...

  7. 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  8. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  9. c/c++ vector,map,set,智能指针,综合运用的小例子

    标准库,智能指针,综合运用的小例子 功能说明:查询单词在文件中出现的次数,如果在同一行出现多次,只算一次. 比如查询单词:你好 输出的结果: 你好 出现了:2次 (行号 2)xxxxxxx 你好 (行 ...

随机推荐

  1. 不要迷恋那些没技术含量的Linux发行版

    昨天悲剧了,重装系统,一个手贱点了替换原系统,分区全给删了,将近三天的工作成果没有了.

  2. JMS学习(三)JMS 消息结构之属性及消息体详解

    一.前言 通过上一篇的学习我们知道了消息分为三个部分,即消息头,属性及消息体,并对消息头的十个属性进行了详细的介绍,本文再对消息属性及消息体进行详细的介绍. 二.属性介绍 消息属性的主要作用是可以对头 ...

  3. yii2时间日期控件的使用[转]

    注:原文http://www.manks.top/yii2-datetimepicker.html 有更改 1.安装 进入到项目文件中D:\phpStudy\WWW\yii2blog    使用cmd ...

  4. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  5. JS 节流

    作为前端的小白,在做项目的过程中,一般只考虑到实现功能,并没有考虑到性能的问题. 比如说,下拉加载更多的这个功能和resize()是特别耗费性能的.此时就要想到节流了. 节流:就是然一个函数无法在短时 ...

  6. 区别CALL SCREEN/SET SCREEN/LEAVE TO SCREEN

    分类: 1,CALL SCREEN XXXX将在Screen调用栈(CALL STACK)上面添加一层调用(进栈),调用XXXX的PBO和PAI,如果XXXX的Next Screen不为0,那么将继续 ...

  7. SharePoint 2013 的HTML5特性之响应式布局

    今天偶然看到一本书<Pro SharePoint 2013 Branding and Responsive Web Development>,看到SharePoint 2013基于HTML ...

  8. Step by step configuration of Outgoing Emails from SharePoint to Microsoft Online

    First of all your SharePoint server should be added to Microsoft online safe sender list, so that Sh ...

  9. FIL Dalian Jobs

    Department Vacancies Total Skill Set Experience Language Hiring Manager Business Finance Finance Ana ...

  10. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q91-Q93)

    Question 91You have a custom user profile property named MyProperty.You need to create a Web Part th ...