目前测试功能正常。若有不完善的地方在改进吧。时候不早了睡觉去,哎,翘课会被抓,不冒险了。晚安全世界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. MVC学习笔记索引帖

    [MVC学习笔记]1.项目结构搭建及单个类在各个层次中的实现 [MVC学习笔记]2.使用T4模板生成其他类的具体实现 [MVC学习笔记]3.使用Spring.Net应用IOC(依赖倒置) [MVC学习 ...

  2. 咋一看DWoo 比 Smarty要好

    虽然很少用模板引擎,但总是有要用到的时候. 随意翻看了两者代码,发现Smarty发展了这么多年居然还在用Eval实现一些特性.其实这没有什么高不高级之分,只是因为eval这个东东,导致一旦语法出错时, ...

  3. vim编辑器,管道,输入输出重定向

    1.vim的认识及其一些常用指令 a, 认识vim的命令行模式和插入模式: 当vim运行后默认进入该模式,他可以控制屏幕光标的移动,字符.字或行的删除,移动复制某区段及进入Insert mode下,或 ...

  4. 认识Python

    web框架:Django.Tornado.Flask Twisted:复杂的异步网络框架 指定解释器 #!/usr/bin/env python #!/usr/bin/python print (&q ...

  5. 关于antlr包删除问题

    在建这个网站,用户登录的时候,涉及查询问题,然后就出现了java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误,我一脸蒙逼,后来 ...

  6. 误报的java.sql.SQLException: Parameter number 21 is not an OUT parameter

    今天为了模拟一个mysql内存不释放问题,要测试一个存储过程,同时具有出参和入参,启动时报了上述错误. <select id="funcl_trd_secu_execution_que ...

  7. c语言中的部分字符串和字符函数

    // // main.c // homeWork1230 // // #include <stdio.h> #include <string.h> #include <c ...

  8. 《慕客网:IOS-动画入门》学习笔记

    新建Cocoa Touch Class,语言是swift 然后继续为界面添加一个普通的View Controller,并且添加前面视图的静态table的转向剪头指向这个View Controller, ...

  9. Swift面向对象基础(上)——Swift中的枚举

    Swift中枚举 学习笔记来自<极客学院> import Foundation /**********1*Swift定义枚举的语法格式*************/ /* enum 枚举名 ...

  10. 大家一起和snailren学java-(六)复用类

    “失恋了,唉,还没开始就结束了……唉……继续看java” 今天又是周末,我们来看看java的复用机制是什么情况.大家知道,代码复用非常实用,这项特性是java的一个重要的部分.那java用什么来实现的 ...