Здравствуйте.
Сразу оговорюсь, использование стороннего кода, даже свободно распространяемого,
невозможно.
Это ограничение написано в техзадании на проект.
Для уменьшения количества проблем, связаных с неудалёнными объектами,
написал простенький базовый класс, подсчитывающий количество ссылок на объекты.
class CSelfDeleting
{
public:
CSelfDeleting() : m_RefCounter(1) {}
virtual ~CSelfDeleting() {}
virtual unsigned long AddRef() const
{
++m_RefCounter;
return m_RefCounter;
}
virtual unsigned long Release() const
{
--m_RefCounter;
if( m_RefCounter == 0 )
delete this;
return m_RefCounter;
}
protected:
unsigned long GetRefCount()
{
return m_RefCounter;
}
private:
mutable unsigned long m_RefCounter;
};
template<class T>
class CObjectHolderCounting // T - должен быть наследником CSelfDeleting
{
public:
// конструкторы, деструктор, операторы присваивания
private:
T* m_pObject;
};
Повсюду в коде обычные указатели заменяются на эти, хммм.., "умные"
Проблема в том, что всё равно можно удалить класс-наследник CSelfDeleting с помощью тривиального delete.
class CMyClass : public CSelfDeleting
{
// blah-blah
};
CMyClass* pObject = new CMyClass;
delete pObject;
Основная идея — запретить удаление объектов посредством delete.
Как бы так сделать, чтобы можно было манипулировать объектами только с помощью "умных" указателей,
но не удалять их с помощью delete.
Желательно, чтобы такие попытки отсекались самим компилятором.