More Effective C++ smart pointer 问题

gorge_an 2007-05-29 11:18:15
template<class T> //
class SmartPtr { //
public:
SmartPtr(T* realPtr = 0);
T* operator->() const;
T& operator*() const;

template<class newType> //
operator SmartPtr<newType>() // 这里返回的是一个新的SmartPtr 的临时对象。临时对象解构的时候岂不是把 pointee 也删除了?
{
return SmartPtr<newType>(pointee);
}
...
};

SmartPtr<Cassette> funMusic(new Cassette("Alapalooza"));
SmartPtr<CD> nightmareMusic(new CD("Disco Hits of the 70s"));

void displayAndPlay(const SmartPtr<MusicProduct>& pmp,
int howMany);


在经过上面的调用的时候,funMusic 的解构是否将删除已经被删除的对象了?

...全文
174 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2007-05-29
  • 打赏
  • 举报
回复
你在MusicProduct的析构函数里加打印,自己数一下打印就知道了。
eduyu 2007-05-29
  • 打赏
  • 举报
回复
你上面的代码并没有调用到这个函数:
operator SmartPtr<newType>()

这个是强制类型转换函数,如下表达式才会被调用到:
SarmtPtr<T> o;
(newType)o 或 static_cast<newType>(o)

一般来说,强制类型转换往往意味着赋值给新类型的对象,
newType n=(newType)o

所以生成临时对象并在对方拷贝数据后,也就是赋值语句后自动销毁这个临时对象是非常合理的。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧