一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧)。最近花了点时间认真看了智能指针,特地来写这篇文章。
1.智能指针是什么简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况。
2.普通指针存在的问题C语言、C++语言没有自动内存回收机制,关于内存的操作的安全性依赖于程序员的自觉。程序员每次new出来的内存块都需要自己使用delete进行释放,流程复杂可能会导致忘记释放内存而造成内存泄漏。而智能指针也致力于解决这种问题,使程序员专注于指针的使用而把内存管理交给智能指针。
我们先来看看普通指针的悬垂指针问题。当有多个指针指向同一个基础对象时,如果某个指针delete了该基础对象,对这个指针来说它是明确了它所指的对象被释放掉了,所以它不会再对所指对象进行操作,但是对于剩下的其他指针来说呢?它们还傻傻地指向已经被删除的基础对象并随时准备对它进行操作。于是悬垂指针就形成了,程序崩溃也“指日可待”。我们通过代码+图来来探求悬垂指针的解决方法。
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 | [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]ptr1[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] new[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(0, 153, 153) !important]1[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]ptr2[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]ptr1[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]ptr3[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]prt2[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr1[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr2[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr3[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=teal !important]delete [color=rgb(0, 45, 122) !important]ptr1[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr2[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; |
代码简单就不啰嗦解释了。运行结果是输出ptr2时并不是期待的1,因为1已经被删除了。这个过程是这样的:
从图可以看出,错误的产生来自于ptr1的”无知“:它并不知道还有其他指针共享着它指向的对象。如果有个办法让ptr1知道,除了它自己外还有两个指针指向基础对象,而它不应该删除基础对象,那么悬垂指针的问题就得以解决了。如下图:
那么何时才可以删除基础对象呢?当然是只有一个指针指向基础对象的时候,这时通过该指针就可以大大方方地把基础对象删除了。
3.什么是引用计数如何来让指针知道还有其他指针的存在呢?这个时候我们该引入引用计数的概念了。引用计数是这样一个技巧,它允许有多个相同值的对象共享这个值的实现。引用计数的使用常有两个目的:
了解了引用计数,我们可以使用它来写我们的智能指针类了。智能指针的实现策略有两种:辅助类与句柄类。这里介绍辅助类的实现方法。
首先,我们来定义一个基础对象类Point类,为了方便后面我们验证智能指针是否有效,我们为Point类创建如下接口:
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 [color=rgb(170, 170, 170) !important]12 [color=rgb(170, 170, 170) !important]13 | [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=teal !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(128, 0, 128) !important]public[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=teal !important]Point[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]xVal[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important],[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]yVal[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]x[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]xVal[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important],[color=rgb(0, 111, 224) !important] [color=teal !important]y[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]yVal[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=teal !important]getX[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]x[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=teal !important]getY[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]y[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]void[color=rgb(0, 111, 224) !important] [color=teal !important]setX[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]xVal[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]x[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]xVal[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]void[color=rgb(0, 111, 224) !important] [color=teal !important]setY[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]yVal[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]y[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]yVal[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(128, 0, 128) !important]private[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]x[color=rgb(51, 51, 51) !important],[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]y[color=rgb(51, 51, 51) !important]; [color=rgb(51, 51, 51) !important]}[color=rgb(51, 51, 51) !important]; |
在创建智能指针类之前,我们先创建一个辅助类。这个类的所有成员皆为私有类型,因为它不被普通用户所使用。为了只为智能指针使用,还需要把智能指针类声明为辅助类的友元。这个辅助类含有两个数据成员:计数count与基础对象指针。也即辅助类用以封装使用计数与基础对象指针。
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 | [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=teal !important]U_Ptr[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(128, 0, 128) !important]private[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]friend[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=teal !important]U_Ptr[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]p[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important],[color=rgb(0, 111, 224) !important] [color=teal !important]count[color=rgb(51, 51, 51) !important]([color=rgb(0, 153, 153) !important]1[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]~[color=teal !important]U_Ptr[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] delete[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(51, 51, 51) !important]; |
引用计数是实现智能指针的一种通用方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。它的具体做法如下:
做好前面的准备后,我们可以来为基础对象类Point书写一个智能指针类了。根据引用计数实现关键点,我们可以写出我们的智能指针类如下:
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 [color=rgb(170, 170, 170) !important]12 [color=rgb(170, 170, 170) !important]13 [color=rgb(170, 170, 170) !important]14 [color=rgb(170, 170, 170) !important]15 [color=rgb(170, 170, 170) !important]16 [color=rgb(170, 170, 170) !important]17 [color=rgb(170, 170, 170) !important]18 [color=rgb(170, 170, 170) !important]19 [color=rgb(170, 170, 170) !important]20 [color=rgb(170, 170, 170) !important]21 [color=rgb(170, 170, 170) !important]22 [color=rgb(170, 170, 170) !important]23 [color=rgb(170, 170, 170) !important]24 [color=rgb(170, 170, 170) !important]25 | [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr [color=rgb(51, 51, 51) !important]{ [color=rgb(128, 0, 128) !important]public[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]rp[color=rgb(51, 51, 51) !important](new[color=rgb(0, 111, 224) !important] [color=teal !important]U_Ptr[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]&sp[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]rp[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]sp[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]++[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]operator[color=rgb(0, 111, 224) !important]=[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]++[color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] if[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(0, 111, 224) !important]--[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]==[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=teal !important]delete [color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*this[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]~[color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] if[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(0, 111, 224) !important]--[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]==[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=teal !important]delete [color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] else[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"还有"[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"个指针指向基础对象"[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]private[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]U_Ptr[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(51, 51, 51) !important]; |
至此,我们的智能指针类就完成了,我们可以来看看如何使用
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 [color=rgb(170, 170, 170) !important]12 [color=rgb(170, 170, 170) !important]13 [color=rgb(170, 170, 170) !important]14 [color=rgb(170, 170, 170) !important]15 [color=rgb(170, 170, 170) !important]16 [color=rgb(170, 170, 170) !important]17 [color=rgb(170, 170, 170) !important]18 [color=rgb(170, 170, 170) !important]19 [color=rgb(170, 170, 170) !important]20 [color=rgb(170, 170, 170) !important]21 [color=rgb(170, 170, 170) !important]22 [color=rgb(170, 170, 170) !important]23 [color=rgb(170, 170, 170) !important]24 [color=rgb(170, 170, 170) !important]25 [color=rgb(170, 170, 170) !important]26 | [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=teal !important]main[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important]) [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//定义一个基础对象类指针 [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]pa[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] new[color=rgb(0, 111, 224) !important] [color=teal !important]Point[color=rgb(51, 51, 51) !important]([color=rgb(0, 153, 153) !important]10[color=rgb(51, 51, 51) !important],[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]20[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//定义三个智能指针类对象,对象都指向基础类对象pa [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//使用花括号控制三个指针指针的生命期,观察计数的变化 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr [color=teal !important]sptr1[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]pa[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important];[color=rgb(153, 153, 153) !important]//此时计数count=1 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr [color=teal !important]sptr2[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]sptr1[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//调用复制构造函数,此时计数为count=2 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr [color=rgb(0, 45, 122) !important]sptr3[color=rgb(0, 111, 224) !important]=[color=rgb(0, 45, 122) !important]sptr1[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//调用赋值操作符,此时计数为conut=3 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//此时count=2 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//此时count=1; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//此时count=0;pa对象被delete掉 [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]pa[color=rgb(0, 111, 224) !important]->[color=teal !important]getX[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=teal !important]system[color=rgb(51, 51, 51) !important]([color=rgb(221, 17, 68) !important]"pause"[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important]; [color=rgb(51, 51, 51) !important]} |
来看看运行结果咯:
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 | 还有[color=rgb(0, 153, 153) !important]2个指针指向基础对象 还有[color=rgb(0, 153, 153) !important]1个指针指向基础对象 [color=rgb(0, 111, 224) !important]-[color=rgb(0, 153, 153) !important]17891602 请按任意键继续[color=rgb(51, 51, 51) !important].[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important].[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]. |
如期,在离开大括号后,共享基础对象的指针从3->2->1->0变换,最后计数为0时,pa对象被delete,此时使用getX()已经获取不到原来的值。
5.智能指针类的改进一虽然我们的SmartPtr类称为智能指针,但它目前并不能像真正的指针那样有->、*等操作符,为了使它看起来更像一个指针,我们来为它重载这些操作符。代码如下所示:
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 [color=rgb(170, 170, 170) !important]12 [color=rgb(170, 170, 170) !important]13 [color=rgb(170, 170, 170) !important]14 [color=rgb(170, 170, 170) !important]15 [color=rgb(170, 170, 170) !important]16 [color=rgb(170, 170, 170) !important]17 [color=rgb(170, 170, 170) !important]18 [color=rgb(170, 170, 170) !important]19 [color=rgb(170, 170, 170) !important]20 [color=rgb(170, 170, 170) !important]21 [color=rgb(170, 170, 170) !important]22 [color=rgb(170, 170, 170) !important]23 [color=rgb(170, 170, 170) !important]24 [color=rgb(170, 170, 170) !important]25 [color=rgb(170, 170, 170) !important]26 [color=rgb(170, 170, 170) !important]27 [color=rgb(170, 170, 170) !important]28 [color=rgb(170, 170, 170) !important]29 [color=rgb(170, 170, 170) !important]30 [color=rgb(170, 170, 170) !important]31 [color=rgb(170, 170, 170) !important]32 [color=rgb(170, 170, 170) !important]33 [color=rgb(170, 170, 170) !important]34 | [color=rgb(51, 51, 51) !important]{ [color=rgb(128, 0, 128) !important]public[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]rp[color=rgb(51, 51, 51) !important](new[color=rgb(0, 111, 224) !important] [color=teal !important]U_Ptr[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]&sp[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]rp[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]sp[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]++[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]operator[color=rgb(0, 111, 224) !important]=[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]++[color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] if[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(0, 111, 224) !important]--[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]==[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=teal !important]delete [color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*this[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]~[color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] if[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(0, 111, 224) !important]--[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]==[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=teal !important]delete [color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] else[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"还有"[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"个指针指向基础对象"[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]operator[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//重载*操作符 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important]*[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]operator[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]->[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//重载->操作符 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]private[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]U_Ptr[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(51, 51, 51) !important]; |
然后我们可以像指针般使用智能指针类
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 | [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]Point[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]pa[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] new[color=rgb(0, 111, 224) !important] [color=teal !important]Point[color=rgb(51, 51, 51) !important]([color=rgb(0, 153, 153) !important]10[color=rgb(51, 51, 51) !important],[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]20[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr [color=teal !important]sptr1[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]pa[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//像指针般使用 [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important]<<[color=rgb(0, 45, 122) !important]sptr1[color=rgb(0, 111, 224) !important]->[color=teal !important]getX[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; |
目前这个智能指针智能用于管理Point类的基础对象,如果此时定义了个矩阵的基础对象类,那不是还得重新写一个属于矩阵类的智能指针类吗?但是矩阵类的智能指针类设计思想和Point类一样啊,就不能借用吗?答案当然是能,那就是使用模板技术。为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。这里贴上上面的智能指针类的模板版:
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 [color=rgb(170, 170, 170) !important]12 [color=rgb(170, 170, 170) !important]13 [color=rgb(170, 170, 170) !important]14 [color=rgb(170, 170, 170) !important]15 [color=rgb(170, 170, 170) !important]16 [color=rgb(170, 170, 170) !important]17 [color=rgb(170, 170, 170) !important]18 [color=rgb(170, 170, 170) !important]19 [color=rgb(170, 170, 170) !important]20 [color=rgb(170, 170, 170) !important]21 [color=rgb(170, 170, 170) !important]22 [color=rgb(170, 170, 170) !important]23 [color=rgb(170, 170, 170) !important]24 [color=rgb(170, 170, 170) !important]25 [color=rgb(170, 170, 170) !important]26 [color=rgb(170, 170, 170) !important]27 [color=rgb(170, 170, 170) !important]28 [color=rgb(170, 170, 170) !important]29 [color=rgb(170, 170, 170) !important]30 [color=rgb(170, 170, 170) !important]31 [color=rgb(170, 170, 170) !important]32 [color=rgb(170, 170, 170) !important]33 [color=rgb(170, 170, 170) !important]34 [color=rgb(170, 170, 170) !important]35 [color=rgb(170, 170, 170) !important]36 [color=rgb(170, 170, 170) !important]37 [color=rgb(170, 170, 170) !important]38 [color=rgb(170, 170, 170) !important]39 [color=rgb(170, 170, 170) !important]40 [color=rgb(170, 170, 170) !important]41 [color=rgb(170, 170, 170) !important]42 [color=rgb(170, 170, 170) !important]43 [color=rgb(170, 170, 170) !important]44 [color=rgb(170, 170, 170) !important]45 [color=rgb(170, 170, 170) !important]46 [color=rgb(170, 170, 170) !important]47 [color=rgb(170, 170, 170) !important]48 [color=rgb(170, 170, 170) !important]49 [color=rgb(170, 170, 170) !important]50 [color=rgb(170, 170, 170) !important]51 [color=rgb(170, 170, 170) !important]52 [color=rgb(170, 170, 170) !important]53 [color=rgb(170, 170, 170) !important]54 [color=rgb(170, 170, 170) !important]55 [color=rgb(170, 170, 170) !important]56 | [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//模板类作为友元时要先有声明 [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]template[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<typename[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important]> [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]template[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<typename[color=rgb(0, 111, 224) !important] [color=teal !important]T[color=rgb(0, 111, 224) !important]> [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=teal !important]U_Ptr[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//辅助类 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]private[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//该类成员访问权限全部为private,因为不想让用户直接使用该类 [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]friend[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]<[color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important]>[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//定义智能指针类为友元,因为智能指针类需要直接操纵辅助类 [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//构造函数的参数为基础对象的指针 [color=rgb(0, 111, 224) !important] [color=teal !important]U_Ptr[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]p[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important],[color=rgb(0, 111, 224) !important] [color=teal !important]count[color=rgb(51, 51, 51) !important]([color=rgb(0, 153, 153) !important]1[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//析构函数 [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]~[color=teal !important]U_Ptr[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] delete[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//引用计数 [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//基础对象指针 [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]template[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<typename[color=rgb(0, 111, 224) !important] [color=teal !important]T[color=rgb(0, 111, 224) !important]> [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]class[color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//智能指针类 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]public[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]rp[color=rgb(51, 51, 51) !important](new[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]U_Ptr[color=rgb(0, 111, 224) !important]<[color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important]>[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]ptr[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//构造函数 [color=rgb(0, 111, 224) !important] [color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]<[color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important]>[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]&sp[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]:[color=teal !important]rp[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]sp[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]++[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//复制构造函数 [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]operator[color=rgb(0, 111, 224) !important]=[color=rgb(51, 51, 51) !important]([color=rgb(128, 0, 128) !important]const[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]<[color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important]>[color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//重载赋值操作符 [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]++[color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//首先将右操作数引用计数加1, [color=rgb(0, 111, 224) !important] if[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(0, 111, 224) !important]--[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]==[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//然后将引用计数减1,可以应对自赋值 [color=rgb(0, 111, 224) !important] [color=teal !important]delete [color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rhs[color=rgb(51, 51, 51) !important].[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*this[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]&[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]operator[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//重载*操作符 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important]*[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]operator[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]->[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//重载->操作符 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]p[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]~[color=teal !important]SmartPtr[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//析构函数 [color=rgb(0, 111, 224) !important] if[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]([color=rgb(0, 111, 224) !important]--[color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]==[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//当引用计数减为0时,删除辅助类对象指针,从而删除基础对象 [color=rgb(0, 111, 224) !important] [color=teal !important]delete [color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] else[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"还有"[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]rp[color=rgb(0, 111, 224) !important]->[color=rgb(0, 45, 122) !important]count[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"个指针指向基础对象"[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]private[color=rgb(0, 111, 224) !important]: [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]U_Ptr[color=rgb(0, 111, 224) !important]<[color=rgb(0, 45, 122) !important]T[color=rgb(0, 111, 224) !important]>[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]rp[color=rgb(51, 51, 51) !important];[color=rgb(0, 111, 224) !important] [color=rgb(153, 153, 153) !important]//辅助类对象指针 [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]}[color=rgb(51, 51, 51) !important]; |
好啦,现在我们能够使用这个智能指针类对象来共享其他类型的基础对象啦,比如int:
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 [color=rgb(170, 170, 170) !important]6 [color=rgb(170, 170, 170) !important]7 [color=rgb(170, 170, 170) !important]8 [color=rgb(170, 170, 170) !important]9 [color=rgb(170, 170, 170) !important]10 [color=rgb(170, 170, 170) !important]11 [color=rgb(170, 170, 170) !important]12 [color=rgb(170, 170, 170) !important]13 [color=rgb(170, 170, 170) !important]14 [color=rgb(170, 170, 170) !important]15 [color=rgb(170, 170, 170) !important]16 [color=rgb(170, 170, 170) !important]17 [color=rgb(170, 170, 170) !important]18 [color=rgb(170, 170, 170) !important]19 [color=rgb(170, 170, 170) !important]20 | [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=teal !important]main[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important]) [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]i[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] new[color=rgb(0, 111, 224) !important] [color=rgb(128, 0, 128) !important]int[color=rgb(51, 51, 51) !important]([color=rgb(0, 153, 153) !important]2[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]<[color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important]>[color=rgb(0, 111, 224) !important] [color=teal !important]ptr1[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]i[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]<[color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important]>[color=rgb(0, 111, 224) !important] [color=teal !important]ptr2[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]ptr1[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]{ [color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]SmartPtr[color=rgb(0, 111, 224) !important]<[color=rgb(128, 0, 128) !important]int[color=rgb(0, 111, 224) !important]>[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]ptr3[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]ptr2[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr1[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr1[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]20[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] cout[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]*[color=rgb(0, 45, 122) !important]ptr2[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]<<[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]endl[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]} [color=rgb(0, 111, 224) !important] [color=teal !important]system[color=rgb(51, 51, 51) !important]([color=rgb(221, 17, 68) !important]"pause"[color=rgb(51, 51, 51) !important])[color=rgb(51, 51, 51) !important]; [color=rgb(0, 111, 224) !important] return[color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]0[color=rgb(51, 51, 51) !important]; [color=rgb(51, 51, 51) !important]} |
运行结果如期所愿,SmartPtr类管理起int类型来了:
[backcolor=rgb(238, 238, 238) !important][color=rgb(170, 170, 170) !important]1 [color=rgb(170, 170, 170) !important]2 [color=rgb(170, 170, 170) !important]3 [color=rgb(170, 170, 170) !important]4 [color=rgb(170, 170, 170) !important]5 | [color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]2 [color=rgb(0, 111, 224) !important] [color=rgb(0, 153, 153) !important]20 [color=rgb(0, 111, 224) !important] 还有[color=rgb(0, 153, 153) !important]2个指针指向基础对象 [color=rgb(0, 111, 224) !important] 还有[color=rgb(0, 153, 153) !important]1个指针指向基础对象 [color=rgb(0, 111, 224) !important] 请按任意键继续[color=rgb(51, 51, 51) !important].[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important].[color=rgb(0, 111, 224) !important] [color=rgb(51, 51, 51) !important]. |
欢迎光临 firemail (http://firemail.wang:8088/) | Powered by Discuz! X3 |