社区
C++ 语言
帖子详情
智能指针中operator &的一个问题
haozi112
2006-03-28 04:57:57
我在看COM技术内幕中智能指针的实现部分时有个地方没有看明白,
T** operator&()
{
assert(m_PI == NULL );
return &m_PI;
}
为什么要断言m_PI== NULL呢?
还有一个地方,在对赋值操作的重载中
T* operator=( T* pI )
{
...
IUnknown *pOld = m_PI; //为什么不直接定义为T* pOld呢,这样做有什么好处吗
...
}
...全文
153
12
打赏
收藏
智能指针中operator &的一个问题
我在看COM技术内幕中智能指针的实现部分时有个地方没有看明白, T** operator&() { assert(m_PI == NULL ); return &m_PI; } 为什么要断言m_PI== NULL呢? 还有一个地方,在对赋值操作的重载中 T* operator=( T* pI ) { ... IUnknown *pOld = m_PI; //为什么不直接定义为T* pOld呢,这样做有什么好处吗 ... }
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
luvybird
2006-03-29
打赏
举报
回复
学习
haozi112
2006-03-28
打赏
举报
回复
ugg(逸学堂(exuetang.net)) 说的很好,我承认,但是那不是我需要的东西,不好意思啊,ugg(逸学堂(exuetang.net)) ,就事论事。你们前面说的我都明白,但healer_kx(天降甘草的甘草)贴的这段代码让我一下子转过湾来了:if (SUCCEEDED(CoCreateInstance(
CLSID_KXDBCore, NULL, CLSCTX_INPROC_SERVER, IID_IKXDBCore, (void**)&m_pDBCore))).我一直都脱离了COM的范围在考虑代码的用意,你点醒了我
healer_kx
2006-03-28
打赏
举报
回复
ugg(逸学堂(exuetang.net)) 他说得很好了~~~真的哦~~~~~~~~.
第二个问题,你想啊.=号重载要做的就是改变引用计数~,要T干吗>? IUnkown*就足够了.
haozi112
2006-03-28
打赏
举报
回复
现在等着第二个问题了,看看别人都怎么分析的,呵呵,healer_kx(天降甘草的甘草) ,给你80分,够意思吧
haozi112
2006-03-28
打赏
举报
回复
哦,明白了,想通了,谢谢healer_kx,我一直到在考虑对m_PI取地址的用意 ,如果说m_PI不等于NULL的时候,对其取地址就就会出现错误,我没有明白的地方就在这里了。这样以来的话一定要保证m_PI是NULL的,而COM要求不能对一个接口指针重复赋值的。也就保证了&运算在接口没有被释放之前不能在Create,现在相通了,谢谢
healer_kx
2006-03-28
打赏
举报
回复
兄弟,你先理清思绪,看看T*和T**的区别.
再给你一段代码,看看它的使用状况.
if (SUCCEEDED(CoCreateInstance(
CLSID_KXDBCore, NULL, CLSCTX_INPROC_SERVER, IID_IKXDBCore, (void**)&m_pDBCore)))
haozi112
2006-03-28
打赏
举报
回复
但是问题是assert( m_PI == NULL ),然后取地址啊,也就是说在这个函数里面,就认为m_PI应该是NULL的,按你们的说法,应该是 assert( m_PI != NULL )啊
healer_kx
2006-03-28
打赏
举报
回复
So Cool
并且从C++观念来看,一个引用
是不需要判断其是否有效的,因为是空引用在C++中不存在
逸学堂
2006-03-28
打赏
举报
回复
T** operator&()
{
assert(m_PI == NULL );
return &m_PI;
}
为什么要断言m_PI== NULL呢?
~~~~~~
CComptr ptr;
com智能指针允许上面那样定义,而这时会调用默认构造函数将m_PI设置为NULL。
所以对一个null指针,取其地址是没有意义的。并且从C++观念来看,一个引用
是不需要判断其是否有效的,因为是空引用在C++中不存在。所以,这时assert(m_PI)
是否为空,再来返回其引用。
还有一个地方,在对赋值操作的重载中
T* operator=( T* pI )
{
...
IUnknown *pOld = m_PI; //为什么不直接定义为T* pOld呢,这样做有什么好处吗
~~~
}
healer_kx
2006-03-28
打赏
举报
回复
就第二个问题再说几句,(虽然我不是10分确定),
IUnknown* p,
即使写成了T* p,也是会转化为 (IUnknown*)p的.毕竟它要做的事情就是AddRef和Release.
有IUnknown就可以了.
healer_kx
2006-03-28
打赏
举报
回复
第二个问题,我觉得都是可以的.
healer_kx
2006-03-28
打赏
举报
回复
首先,第一个问题,你要知道智能指针怎么用吧,你想想它的用法?当然要为NULL了.
C++内存泄漏检测原理+代码
在C++编程
中
,内存泄漏是
一个
严重的
问题
,它会导致程序消耗过多的系统资源,最终可能使程序崩溃或系统性能下降。本文档将深入探讨C++内存泄漏检测的原理,并提供相关的代码示例。 首先,我们需要理解什么是内存泄漏...
【c++】
智能指针
详解&&c++特殊类设计&&c++的类型转换
【c++】
智能指针
详解&&c++特殊类设计&&c++的类型转换
C++11:
智能指针
智能指针
:是指用于存储和封装指针的类,被存储的指针指向了从堆上动态分配的对象,能够在适当的时间自动删除指向的对象。
智能指针
在面对异常的时候能确保...实现
一个
最简单的
智能指针
: template<typename T..
operator
* 和
operator
-> 操作符的重载在自定义
智能指针
class MyPtr
中
的应用
operator
* 和
operator
-> 操作符的重载在自定义
智能指针
class MyPtr
中
的应用
C++
智能指针
详解
用
智能指针
便可以有效缓解这类
问题
,本文主要讲解参见的
智能指针
的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_pt
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章