时间:2014-01-30 来源:

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

     智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类承接网站前端,用于生存期控制,承接网站前端能够确保自动正确的销毁动态分配的对象,html切图报价防止内存泄露.它的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联团队网页接活,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,团队网页接活初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,手机网页制作拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时网页切图制作,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,网页重构报价构造函数减少引用计数(如果引用计数减至0,则删除基础对象).
    智能指针就是模拟指针动作的类.所有的智能指针都会重载 -> 和 * 操作符.智能指针还有许多其他功能,承接网站前端比较有用的是自动销毁.这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存.当然psd切图html,智能指针还不止这些,psd切图html还包括复制时可以修改源对象等.智能指针根据需求不同web外包,设计也不同(写时复制,div切图排版赋值即释放对象拥有权限、引用计数等网页切图制作,控制权转移等).auto_ptr 即是一种常见的智能指针.
     智能指针通常用类模板实现:
复制代码 代码如下:

template <class T>
class smartpointer
{
private:
T *_ptr;
public:
smartpointer(T *p) : _ptr(p) //构造函数
{
}
T& operator *() //重载*操作符
{
return *_ptr;
}
T* operator ->() //重载->操作符
{
return _ptr;
}
~smartpointer() //析构函数
{
delete _ptr;
}
};

实现引用计数有两种经典策略,网页切图制作在这里将使用其中一种div+css+js切图,这里所用的方法中,div+css+js切图需要定义一个单独的具体类用以封装引用计数和相关指针:
复制代码 代码如下:

// 定义仅由HasPtr类使用的U_Ptr类承接网站前端,我们不希望普通用户使用U_Ptr类psd切图html,所以它没有任何public成员
// 将HasPtr类设置为友元,psd切图html使其成员可以访问U_Ptr的成员
class U_Ptr
{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p) : ip(p) , use(1)
{
cout << "U_ptr constructor called !" << endl;
}
~U_Ptr()
{
delete ip;
cout << "U_ptr distructor called !" << endl;
}
};

       HasPtr类需要一个析构函数来删除指针.但是,手机网页制作析构函数不能无条件的删除指针.”
      条件就是引用计数.如果该对象被两个指针所指网页切图制作,那么删除其中一个指针,div页面并不会调用该指针的析构函数div+css+js切图,因为此时还有另外一个指针指向该对象.看来,div+css+js切图智能指针主要是预防不当的析构行为承接网站前端,防止出现悬垂指针.

     如上图所示,承接网站前端HasPtr就是智能指针psd切图html,use记录了*ip对象被多少个HasPtr对象所指.假设现在又两个HasPtr对象p1、p2指向了U_Ptr,use变量将自减1,  U_Ptr不会析构,网页切图制作那么U_Ptr指向的对象也不会析构div+css+js切图,那么p2仍然指向了原来的对象,网页重构报价而不会变成一个悬空指针.当delete p2的时候承接网站前端,为0.此时psd切图html,U_Ptr对象进行析构,psd切图html那么U_Ptr指向的对象也进行析构web外包,保证不会出现内存泄露. 
    包含指针的类需要特别注意复制控制,div切图排版原因是复制指针时只复制指针中的地址网页切图制作,而不会复制指针指向的对象.
    大多数C++类用三种方法之一管理指针成员
    (1)不管指针成员.复制时只复制指针,网页切图制作不复制指针指向的对象.当其中一个指针把其指向的对象的空间释放后div+css+js切图,其它指针都成了悬浮指针.这是一种极端
    (2)当复制的时候,div+css+js切图即复制指针承接网站前端,也复制指针指向的对象.这样可能造成空间的浪费.因为指针指向的对象的复制不一定是必要的.
   (3) 第三种就是一种折中的方式.利用一个辅助类来管理指针的复制.原来的类中有一个指针指向辅助类,页面div重构辅助类的数据成员是一个计数器和一个指针(指向原来的)(此为本次智能指针实现方式).
     其实psd切图html,智能指针的引用计数类似于java的垃圾回收机制:java的垃圾的判定很简答,psd切图html如果一个对象没有引用所指web外包,那么该对象为垃圾.系统就可以回收了.
     HasPtr 智能指针的声明如下,手机网页制作保存一个指向U_Ptr对象的指针网页切图制作,U_Ptr对象指向实际的int基础对象,div页面代码如下:
复制代码 代码如下:

#include<iostream>
using namespace std;

// 定义仅由HasPtr类使用的U_Ptr类div+css+js切图,我们不希望普通用户使用U_Ptr类承接网站前端,所以它没有任何public成员
// 将HasPtr类设置为友元,承接网站前端使其成员可以访问U_Ptr的成员
class U_Ptr
{
    friend class HasPtr;
    int *ip;
    size_t use;
    U_Ptr(int *p) : ip(p) , int i) : ptr(new U_Ptr(p)) , val(orig.val)
    {
        ++ptr->use;
        cout << "HasPtr copy constructor called ! " << "use = " << ptr->use << endl;
    }

    // 赋值操作符
    HasPtr& operator=(const HasPtr&);

    // 析构函数:如果计数为0,则删除U_Ptr对象
    ~HasPtr()
    {
        cout << "HasPtr distructor called ! " << "use = " << ptr->use << endl;
        if (--ptr->use == 0)
            delete ptr;
    }

    // 获取数据成员
    int *get_ptr() const
    {
        return ptr->ip;
    }
    int get_int() const
    {
        return val;
    }

    // 修改数据成员
    void set_ptr(int *p) const
    {
        ptr->ip = p;
    }
    void set_int(int i)
    {
        val = i;
    }

    // 返回或修改基础int对象
    int get_ptr_val() const
    {
        return *ptr->ip;
    }
    void set_ptr_val(int i)
    {
        *ptr->ip = i;
    }
private:
    U_Ptr *ptr;   //指向使用计数类U_Ptr
    int val;
};
HasPtr& HasPtr::operator = (const HasPtr &rhs)  //注意,网页切图制作这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,若该对象的使用计数减至0, 100);    // 构造函数
    HasPtr *hpb = new HasPtr(*hpa);     // 拷贝构造函数
    HasPtr *hpc = new HasPtr(*hpb);     // 拷贝构造函数
    HasPtr hpd = *hpa;     // 拷贝构造函数

    cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
    hpc->set_ptr_val(10000);
    cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
    hpd.set_ptr_val(10);
    cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
    delete hpa;
    delete hpb;
    delete hpc;
    cout << hpd.get_ptr_val() << endl;
    return 0;
}

这里的赋值操作符比较麻烦psd切图html,一个指向内容为42的内存web外包,一个指向内容为100的内存,div切图排版如下图:

现在网页切图制作,我要做赋值操作,网页切图制作p2 = p1.对比着上面的
复制代码 代码如下:

HasPtr& operator=(const HasPtr&); // 赋值操作符
此时div+css+js切图,首先将p1指向的ptr的use加1,
复制代码 代码如下:

++rhs.ptr->use; // 增加右操作数中的使用计数
然后,页面div重构做:
复制代码 代码如下:

if (--ptr->use == 0)
delete ptr;
因为psd切图html,原先p2指向的对象现在p2不在指向,psd切图html那么该对象就少了一个指针去指web外包,所以,手机网页制作use做自减1;
此时网页切图制作,条件成立.因为u2的use为1.那么,div页面运行U_Ptr的析构函数div+css+js切图,而在U_Ptr的析构函数中,div+css+js切图做了delete ip操作承接网站前端,所以释放了内存,承接网站前端不会有内存泄露的问题.
接下来的操作很自然psd切图html,无需多言:
复制代码 代码如下:

ptr = rhs.ptr; // 复制U_Ptr指针
val = rhs.val; // 复制int成员
return *this;
做完赋值操作后,承接网页制作那么就成为如下图所示了.红色标注的就是变化的部分:

而还要注意的是web外包,重载赋值操作符的时候,手机网页制作一定要注意的是网页切图制作,检查自我赋值的情况.
如图所示:

此时,网页切图制作做p1 = p1的操作.那么div+css+js切图,为2;然后承接网站前端,为1.那么就不会执行delete操作psd切图html,剩下的操作都可以顺利进行.按《C++ primer》说法,psd切图html“这个赋值操作符在减少左操作数的使用计数之前使rhs的使用计数加1,从而防止自身赋值”.哎,div切图排版反正我是那样理解的.当然网页切图制作,赋值操作符函数中一来就可以按常规那样:
复制代码 代码如下:

if(this == &rhs)
return *this;
运行结果如下图:

点击次数:7484
作者:
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日在androidstudio中,使用getAssets获取文件的问题【综合】2015年08月30日JAVA笔记:Java类集总结(二、Map接口及相关)【移动开发】2015年01月20日oracle11gsqldeveloper安装后无法使用【云计算】2015年06月11日【ASP.NET】——AdRotator控件 【编程语言】2015年08月03日ASP错误提示大全2014年01月28日13.ListView和GridView【移动开发】2015年06月01日项目管理和代码托管平台GitLabv9.0.3发布 ,,2017年04月06日黑马day14过滤器之解决所有乱码 【移动开发】2015年07月13日360网站漏洞检测【移动开发】2015年04月17日Firebug折腾记_(3)JS调试小技巧 【综合】2015年08月24日javascript之字符串函数 【移动开发】2014年12月25日android调用系统裁剪图片的设置【系统运维】2015年01月19日广搜简单题2015年08月03日第一个Cocos2d-xLua游戏 【编程语言】2015年05月11日用PHP实现多服务器共享SESSION数据的方法2014年01月29日delphi中一种好用的数组定义方法以及函数嵌套的使用源代码 【编程语言】2015年04月13日颜色转换IOS中十六进制的颜色转换为UIColor2014年12月09日JScheckbox控制操作代码2014年01月29日基于指针的数据类型与指针运算小结2014年01月30日POJ2528Mayor'sposters(线段树+离散化)【编程语言】2015年04月09日桌面Linux发行,Descent|OS3.0发布 ,,2016年06月23日SharePointWorkflow架构(二)Workflow事件处理(EventProcessing) 【综合】2015年01月12日网络管理不得不知道的一些常识2014年11月10日数组变量和指针的关系 【移动开发】2015年07月27日java中变量的使用规则【编程语言】2015年05月19日2015.03.20使命 【编程语言】2015年03月24日shell脚本之if、for、while语句【编程语言】2014年11月04日中兴:员工月薪万元仍感深圳生活困难 ,,2016年06月23日基于Node.js和express的日志服务器【Web前端】2014年11月27日php统计文件大小,以GB、MB、KB、B输出2014年01月29日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)