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 的解构是否将删除已经被删除的对象了?

...全文
136 点赞 收藏 2
写回复
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

所以生成临时对象并在对方拷贝数据后,也就是赋值语句后自动销毁这个临时对象是非常合理的。
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告