目前测试功能正常。若有不完善的地方在改进吧。时候不早了睡觉去,哎,翘课会被抓,不冒险了。晚安全世界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. 设置窗体透明C#代码

    上个示例是C#调用windows api 在原来代码上加入窗体透明,控件不透明代码: using System; using System.Runtime.InteropServices; using ...

  2. 百度地图js根据经纬度定位和拖动定位点

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  3. Linq之Lambda表达式

    一 什么是LINQ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...

  4. WebApi传参总动员(填坑)

    本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑. 这个坑就是: (body 只能被读取一次)Only one thing can read the body MVC和W ...

  5. 在uwp仿制WPF的Window

    移植WPF软件到uwp时碰到用作对话框的Window有多种处理选择.我个人认为最省事的是用ContentDialog模拟Window. 比如你想把上面这个WPF窗体弄到uwp里面去 1.修改Conte ...

  6. 【jQuery基础学习】02 jQuery的DOM操作

    DOM操作分为3个方面: DOM Core    任何一种支持DOM Core的语言都可以使用它,比如getElementById就是DOM Core操作 HTML-DOM  只能用来处理web文档 ...

  7. csharp:Chart

    http://www.dotnetperls.com/chart using System; using System.Windows.Forms; using System.Windows.Form ...

  8. EntityFramework 更新表结构到数据库

    在程序包管理器控制台 1.执行:Enable-Migrations -Force  生成:Migrations 2 修改AutomaticMigrationsEnabled默认为false改为true ...

  9. 【iOS】Quartz2D绘图路径Path

    一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径  cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用 ...

  10. .NET Core创建一个控制台(Console)程序

    .NET Core版本:1.0.0-rc2 Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2 开发及运行平台:Window ...