BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #39919同步于 2010/6/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求助】求大牛解答C++ primer中的一个较深的问题

jackbupt
2010/6/1镜像同步16 回复
最近在学习C++ primer(4th edition),在复制控制这一章内容中,作者指出:当类中定义有指针成员时,需要特别注意复制控制,否则极易出错。针对这个问题,作者提出了“定义智能指针类”的方法,具体方法就是定义一个新的类,叫“计数类”,来对该原类中共用指针成员的对象做统一管理计数。 但是我读完后,有个疑问:为什么不直接定义一个static变量计数器,然后在复制构造函数当中去每次复制构造一次就加1,当且仅当该计数器为0时才delete掉相应指针。 不知道我的想法是否正确,期待大牛指点。谢谢!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
jokerlee机器人#1 · 2010/6/1
实际上智能指针就是这么做的,自己管理当然是可以的,但是指针多了就很麻烦了
jackbupt机器人#2 · 2010/6/1
首先,谢谢解答。 只是我觉得,指针多了的话,PRIMER当中所说的智能指针就更加麻烦了,它需要定义多个计数类,以应对每个原类中的指针的复制。而如果采用static成员在复制构造函数中去计数的话,只要原类中有多少个指针,那么就定义多少个static成员就够了。这样相比起来,后者好像更优啊? 【 在 jokerlee 的大作中提到: 】 : 实际上智能指针就是这么做的,自己管理当然是可以的,但是指针多了就很麻烦了
jokerlee机器人#3 · 2010/6/1
【 在 jackbupt 的大作中提到: 】 : 首先,谢谢解答。 : 只是我觉得,指针多了的话,PRIMER当中所说的智能指针就更加麻烦了,它需要定义多个计数类,以应对每个原类中的指针的复制。而如果采用static成员在复制构造函数中去计数的话,只要原类中有多少个指针,那么就定义多少个static成员就够了。这样相比起来,后者好像更优啊? 自己控制指针也许执行效率更优,但是通过抽象的智能指针编码效率更高,并且减少了出错的风险。究竟怎么做需要根据实际情况权衡,自己控制指针引用计数获得的效率上的提升是否能与带来的开发成本的提高相匹配需要仔细考量。
jmpesp机器人#4 · 2010/6/1
【 在 jackbupt 的大作中提到: 】 : 首先,谢谢解答。 : 只是我觉得,指针多了的话,PRIMER当中所说的智能指针就更加麻烦了,它需要定义多个计数类,以应对每个原类中的指针的复制。而如果采用static成员在复制构造函数中去计数的话,只要原类中有多少个指针,那么就定义多少个static成员就够了。这样相比起来,后者好像更优啊? 注意多线程 static 变量的多线程同步与互斥。。。
focuson机器人#5 · 2010/6/1
这个计数器不能是static的, static是表明被指向的对象所属的类classA的属性,即classA有多少现存对象。 实际上这个计数器的作用是记录某个对象被多少指针指向, 如果classA有两个对象, 通常这两个对象的引用计数不同, 用static就变成相同的了
ericyosho机器人#6 · 2010/6/1
有基础设施的,必须用基础设施。 人家加到库里面去的,都是经过N多人思考过的结果。 自己想的,必须不全面。
fwh19890125机器人#7 · 2010/6/1
【 在 ericyosho 的大作中提到: 】 : 有基础设施的,必须用基础设施。 : 人家加到库里面去的,都是经过N多人思考过的结果。 : 自己想的,必须不全面。 : ................... 虽然没说出原理,但这话有道理
a206206机器人#8 · 2010/6/1
【 在 ericyosho 的大作中提到: 】 : 有基础设施的,必须用基础设施。 : 人家加到库里面去的,都是经过N多人思考过的结果。 : 自己想的,必须不全面。 re 能放进库里的必然都是经过无数人想尽办法优化后的成果
jackbupt机器人#9 · 2010/6/2
没有说是加到库里面去的,就是作者提出新建一个类。然后在这个类里面定义新的计数器。而我的想法是在原类中定义static计数器,在“复制”构造函数当中进行增长计数。 【 在 ericyosho 的大作中提到: 】 : 有基础设施的,必须用基础设施。 : 人家加到库里面去的,都是经过N多人思考过的结果。 : 自己想的,必须不全面。