Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Но все-таки, почему не SafeHandle?
Как это — "без изменений", когда вместо деструктора и финализатора будет использоваться метод ReleaseHandle, а вместо поля T* ptr — поле базового класса IntPtr handle?
using SH = System::Runtime::InteropServices::SafeHandle;
using PtrType = System::IntPtr;
template <typename T>
public ref class ImplPtrBase : SH
{
protected:
ImplPtrBase(T* p) : SH(PtrType::Zero, true)
{
handle = PtrType(p);
}
T* Ptr() { return static_cast<T*>(handle.ToPointer()); }
bool ReleaseHandle() override
{
delete Ptr();
return true;
}
public:
property bool IsInvalid
{
bool get() override
{
return (handle == PtrType::Zero);
}
}
};
Разработка классов-дескрипторов на C++/CLI