社区
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呢,这样做有什么好处吗
...
}
...全文
175
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写文章
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++核心特性解析:从auto、移动语义到
智能指针
与并发编程
本文系统解析C++11/14关键特性:auto类型推导、移动语义与右值引用、unique_ptr/shared_ptr
智能指针
、Lambda表达式及std::async任务并发模型。重点涵盖类型推导规则、完美转发、RAII资源管理、捕获语义、基于任务的异步编程范式,并结合《Effective Modern C++》典型条款剖析常见陷阱与最佳实践,强调安全性、性能与可维护性。
从Python到C++:
一个
机械工程师的Creo二次开发踩坑实录(附完整VSCode配置)
本文聚焦机械工程师在Creo二次开发
中
从Python过渡到C++的技术实践,重点介绍基于VSCode+nmake的轻量高效开发环境搭建、Toolkit插件开发全流程、
智能指针
与对象模型使用、内存管理、多线程安全、跨版本兼容性处理及性能调优等核心技术要点,涵盖编译配置、调试技巧、测试框架与CI/CD集成等工程化关键环节。
【notes6】linux命令/工具,systemd,文件操作,动静态库,信号,socket,std&boost,raii,
智能指针
,引用,完美转发,数据结构,类和对象,python
本文系统梳理Linux命令(find/grep/sed/awk/shell)、systemd服务管理、文件I/O操作、动静态库链接机制(含-lm原理)、信号处理、socket网络编程;深入讲解C++ RAII、
智能指针
(unique_ptr实现)、引用语义(左值/右值/完美转发)、模板元编程基础;涵盖数据结构(红黑树/vector/map)、内存对齐、字节序及典型IPC机制。内容聚焦系统级开发所需底层技术栈。
C++实战:命令行订餐系统架构设计与ODBC数据库操作详解
本文详解基于C++和ODBC访问Access数据库的命令行订餐系统,涵盖三层架构设计、核心数据模型(用户/菜品/订单/订单明细)、ODBC连接与资源管理、参数化查询防SQL注入、事务一致性保障,以及现代C++重构建议(
智能指针
、DAO模式、异常处理)。重点解析数据库操作安全实践、
中
文编码处理、自增ID获取及常见崩溃与乱码
问题
调试方法。
调用C,C++ lib文件
本文详细介绍了如何在C语言
中
调用C++编写的库文件,以及C++调用C库的方法,包括在源代码
中
的 extern C 使用、编译选项设置、链接错误处理等。同时,文章列举并解决了多个在混合编程
中
常见的链接错误,如MSVCRTD.LIB和LIBCMTD.LIB冲突、
operator
new/delete错误,以及不同Visual Studio版本间的兼容性
问题
。
C++ 语言
65,210
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章