为了实现引用计数,我们使用了一个IUnknown
-like 接口和一个智能指针模板类。该接口实现了所有引用计数方法,包括Release()
:
void IUnknownLike::Release()
{
if( --refCount == 0 ) {
delete this;
}
}
智能指针模板类有一个复制构造函数和一个赋值运算符,它们都接受原始指针。因此用户可以执行以下操作:
class Class : public IUnknownLike {
};
void someFunction( CSmartPointer<Class> object ); //whatever function
Class object;
someFunction( &object );
并且程序运行到未定义的行为 - 对象被创建时引用计数为零,智能指针被构造并将其碰撞到 1,然后函数返回,智能指针被破坏,调用Release()
导致delete
堆栈分配的变量。
用户还可以执行以下操作:
struct COuter {
//whatever else;
Class inner;// IUnknownLike descendant
};
COuter object;
somefunction( &object.Inner );
再一次没有创建的对象new
是delete
d。处于最佳状态的未定义行为。
有没有办法改变IUnknownLike
接口,以便用户被迫使用new
创建所有派生的对象IUnknownLike
- 直接派生和间接派生(在最派生和基础之间的类)?