接口的实现类,在构造函数中是否应该将引用计数置为1解决思路
接口的实现类,在构造函数中是否应该将引用计数置为1
比如我写了一个接口IA,从IUnknown继承
然后写了一个实现IA的类
那么这个类在构造函数中是否应该将引用计数置为1?还是0?
------解决方案--------------------
0
------解决方案--------------------
No, ATL的模板类会为你控制引用计数,具体是在IUnkown::AddRef/ReleaseRef实现中。
------解决方案--------------------
请你保证 addRef 和 Release 成对。
CreateInstance 的时候,使用 new, 如果不成功,使用 delete,不要使用 Release 释放。
------解决方案--------------------
应该置0 ,而非1
------解决方案--------------------
调用CreateInstance和QueryInterface时,COM会自动加1的不用你加。你只需要Release
------解决方案--------------------
当然如果你完全抛弃COM那套东西,只不过想用IUnkuow的计数的话。那你需要重定义IUnKnow中的AddRef Release等函数,自己写实现,该+1就+1,该-1就-1。IUnKnow中定义的都是纯虚函数。
------解决方案--------------------
ls 一看就没用过c 写com
------解决方案--------------------
因为用户创建接口后要调用addref如果你在构造函数里面置1,后面的addref就会把引用计数弄错
------解决方案--------------------
身为版主就不要说这种嘲讽的话,是工作不饱和无聊的想找人对喷么。我可是百忙之中抽空上****学习交流力所能及的帮助被人解决问题的,你这一句话不是打压我积极性么。
就事论事,我的意思是他需要自己写AddRef Release的实现,利用InterlockedDecrement/InterlockedIncrement自己管理计数。因为lz说不用ATL自己实现接口。通过他3L的回答我觉得他可能是想自己写引用计数才做次回答的。并没有涉及到构造函数中引用计数的问题。
引用计数和接口实现类没用关系,应该是由类场或IUnknow自己维持。所以在实现类中就不应该出现对引用计数操作的概念。
------解决方案--------------------
释不释放都是你自己控制的
如果都是你自己写的主要管理好了不必纠结具体实现
但从理论上计数器应该用通过AddRef/ReleaseRef管理
也就是由IUnkown统一管理
------解决方案--------------------
这叫嘲讽吗?我只是就事论事而已,谁告诉你com会在createinstance自动给你加一
------解决方案--------------------
有学习和帮助别人的积极性是好事,我支持,但是说错,就应该允许别人指出错误,这样才能进步,你说对不对?
------解决方案--------------------
明显是1,说0的都是不懂com的
当然也有0的时候,比如IDataObject
------解决方案--------------------
com 本质论看第二章,里面如何实现iunkown
------解决方案--------------------
同意观点。我当然也希望能够通过指出我的错误来实现共同进步。但我也同时希望例如8L这种没有技术要点纯粹吐槽性质的否定性回复尽量少出现在技术论坛里好。你要是和9l写在一块我就不说什么了,还单开一楼。
------解决方案--------------------
无所谓1还是0,主要是看CreateInstance时QueryInterface后面有没有Release,不写Release的其实都是不懂com的
比如我写了一个接口IA,从IUnknown继承
然后写了一个实现IA的类
那么这个类在构造函数中是否应该将引用计数置为1?还是0?
------解决方案--------------------
0
------解决方案--------------------
No, ATL的模板类会为你控制引用计数,具体是在IUnkown::AddRef/ReleaseRef实现中。
------解决方案--------------------
请你保证 addRef 和 Release 成对。
CreateInstance 的时候,使用 new, 如果不成功,使用 delete,不要使用 Release 释放。
------解决方案--------------------
应该置0 ,而非1
------解决方案--------------------
调用CreateInstance和QueryInterface时,COM会自动加1的不用你加。你只需要Release
------解决方案--------------------
当然如果你完全抛弃COM那套东西,只不过想用IUnkuow的计数的话。那你需要重定义IUnKnow中的AddRef Release等函数,自己写实现,该+1就+1,该-1就-1。IUnKnow中定义的都是纯虚函数。
------解决方案--------------------
ls 一看就没用过c 写com
------解决方案--------------------
因为用户创建接口后要调用addref如果你在构造函数里面置1,后面的addref就会把引用计数弄错
------解决方案--------------------
身为版主就不要说这种嘲讽的话,是工作不饱和无聊的想找人对喷么。我可是百忙之中抽空上****学习交流力所能及的帮助被人解决问题的,你这一句话不是打压我积极性么。
就事论事,我的意思是他需要自己写AddRef Release的实现,利用InterlockedDecrement/InterlockedIncrement自己管理计数。因为lz说不用ATL自己实现接口。通过他3L的回答我觉得他可能是想自己写引用计数才做次回答的。并没有涉及到构造函数中引用计数的问题。
引用计数和接口实现类没用关系,应该是由类场或IUnknow自己维持。所以在实现类中就不应该出现对引用计数操作的概念。
------解决方案--------------------
释不释放都是你自己控制的
如果都是你自己写的主要管理好了不必纠结具体实现
但从理论上计数器应该用通过AddRef/ReleaseRef管理
也就是由IUnkown统一管理
------解决方案--------------------
调用CreateInstance和QueryInterface时,COM会自动加1的不用你加。你只需要Release
ls 一看就没用过c 写com
这叫嘲讽吗?我只是就事论事而已,谁告诉你com会在createinstance自动给你加一
------解决方案--------------------
有学习和帮助别人的积极性是好事,我支持,但是说错,就应该允许别人指出错误,这样才能进步,你说对不对?
------解决方案--------------------
明显是1,说0的都是不懂com的
当然也有0的时候,比如IDataObject
------解决方案--------------------
com 本质论看第二章,里面如何实现iunkown
------解决方案--------------------
有学习和帮助别人的积极性是好事,我支持,但是说错,就应该允许别人指出错误,这样才能进步,你说对不对?
同意观点。我当然也希望能够通过指出我的错误来实现共同进步。但我也同时希望例如8L这种没有技术要点纯粹吐槽性质的否定性回复尽量少出现在技术论坛里好。你要是和9l写在一块我就不说什么了,还单开一楼。
------解决方案--------------------
嗯,应该是1,我是在构造函数中调用AddRef的,保证调用者在new的时候计数已经是1了
无所谓1还是0,主要是看CreateInstance时QueryInterface后面有没有Release,不写Release的其实都是不懂com的