我正在编写智能指针的代码作为练习。使用在线教程(1,2),我已经开发了一个带有引用计数的普通智能指针类。问题是我无法解决以下问题:
当智能指针检测到不再存在对特定对象的引用时,即使最终智能指针的模板参数是基类型,它也必须通过指向原始类型的指针删除对象,这是为了避免非虚析构函数的对象切片。
我该如何实现呢?基本上,我的代码看起来像下面这样(来自教程)。
现在考虑
当智能指针检测到不再存在对特定对象的引用时,即使最终智能指针的模板参数是基类型,它也必须通过指向原始类型的指针删除对象,这是为了避免非虚析构函数的对象切片。
我该如何实现呢?基本上,我的代码看起来像下面这样(来自教程)。
template < typename T > class SP
{
private:
T* pData; // pointer
RC* reference; // Reference count
public:
SP() : pData(0), reference(0)
{
// Create a new reference
reference = new RC();
// Increment the reference count
reference->AddRef();
}
SP(T* pValue) : pData(pValue), reference(0)
{
// Create a new reference
reference = new RC();
// Increment the reference count
reference->AddRef();
}
SP(const SP<T>& sp) : pData(sp.pData), reference(sp.reference)
{
// Copy constructor
// Copy the data and reference pointer
// and increment the reference count
reference->AddRef();
}
~SP()
{
// Destructor
// Decrement the reference count
// if reference become zero delete the data
if(reference->Release() == 0)
{
delete pData;
delete reference;
}
}
T& operator* ()
{
return *pData;
}
T* operator-> ()
{
return pData;
}
SP<T>& operator = (const SP<T>& sp)
{
// Assignment operator
if (this != &sp) // Avoid self assignment
{
// Decrement the old reference count
// if reference become zero delete the old data
if(reference->Release() == 0)
{
delete pData;
delete reference;
}
// Copy the data and reference pointer
// and increment the reference count
pData = sp.pData;
reference = sp.reference;
reference->AddRef();
}
return *this;
}
};
编辑:
为了实现这个目标,我必须拥有指向原始类型的指针。
我在这里发布了一个问题:通过指向派生类而不是基类的指针进行删除
但现在,由于查看了评论和答案,我认为两者都相关。我有以下构造函数:
template <typename T>
template <typename U>
Sptr<T>::Sptr(U* u) : obj(u),ref(NULL) {
//do something
ref = new RC();
ref->AddRef();
}
现在考虑
Sptr<Base1> sp(new Derived);
,其中 Derived
是从 Base1
派生而来的。 Base1 有受保护的构造函数/析构函数。
这将为类型 T
的对象存储,但我需要通过类型 U 的对象进行存储。我需要保留它。我该如何做?
SP
一个模板构造函数SP<T>::SP(U *u) { ... }
,并以某种方式存储原始类型U
(必须派生自T
),以便能够稍后调用U
的析构函数。 - Angew is no longer proud of SOSmartPtr<Base> = SmartPtr<Derived>
正常工作。 - Yakk - Adam NevraumontU*
上键入的delete
表达式。 - Angew is no longer proud of SO