博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shared_ptr模版推导的问题
阅读量:6277 次
发布时间:2019-06-22

本文共 1243 字,大约阅读时间需要 4 分钟。

问题描述

今天在帮同事解决问题时,发现了这个比较有意思的现象,特记录下来备忘。

问题是这样的,同事开发的是应用程序动态库模块,通过应用的框架中以接口方式供外部使用。然后他想对这些接口生命周期进行控制,从语法角度上约束使用者使用的手段。因此他作出了以下修改:
1.增加接口的析构函数,并将析构函数设定为保护级别
2.返回接口的函数用shared_ptr的形式返回

具体代码示例

// 测试接口struct IAA{    virtual void Release() = 0;protected:    virtual ~IAA(){}};// 对象删除器struct HelpDeleteIAA{    void operator()(IAA* pAA)    {        if (NULL!=pAA)        {            pAA->Release();        }    }};class CAA : public IAA{public:    CAA()    {    }    virtual ~CAA()    {    }    virtual void Release()    {        delete this;    }};typedef std::tr1::shared_ptr
SPIAA;// 测试创建SPIAA helpIAA(bool bFlag){ if (bFlag) { return SPIAA(new CAA, HelpDeleteIAA()); } return SPIAA(static_cast
(NULL));}int main(){ SPIAA spAA = helpIAA(); // 测试使用 return 0;}

写完以后兴冲冲的一编译,傻眼了,提示是不能访问IAA::~IAA()的析构接口。可是在代码中明显指定了删除器啊?百思不得其解。。。

问题原因分析

经过调试后发现问题出现在helpIAA()的函数中,由于智能指针shared_ptr()是一个模版,满足模版推导的过程,而在helpIAA()函数中用到了两种函数构造原型,猜测可能是编译过程中对该模版推导顺序影响了最后产生的结果。

解决方案

将helpIAA()函数的返回代码

return SPIAA(static_cast
(NULL));

修改为

return SPIAA(static_cast
(NULL), HelpDeleteIAA());

然后执行编译,编译器顺利编译通过了。

总结

以上的问题原因推断只是我个人的一点看法,如果不正确的地方欢迎各位斧正。

转载于:https://www.cnblogs.com/sanghg/p/4073465.html

你可能感兴趣的文章
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
【2016阿里安全峰会】解读安全人才缺乏困境破解之法【附PDF下载】
查看>>
50条大牛C++编程开发学习建议
查看>>
rsync同步服务配置手记
查看>>
Android下创建一个sqlite数据库
查看>>
数组<=>xml 相互转换
查看>>
MFC单文档应用程序显示图像
查看>>
DT科技评论:第2期
查看>>
poj 2777(线段树的节点更新策略)
查看>>
Swift-EasingAnimation
查看>>
[翻译] BKZoomView
查看>>
C++类设计的一些心得
查看>>
tableVIew删除时的delete按钮被挡住时重写的方法
查看>>
读cookie中文字符乱码问题
查看>>
招募译者翻译并发数据结构
查看>>
普通表转换为分区表
查看>>
Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
查看>>
性能优化总结(六):预加载、聚合SQL应用实例
查看>>
Drill官网文档翻译四 Drill的性能
查看>>